.Net Core下HTTP請(qǐng)求IHttpClientFactory示例詳解
使用方式
IHttpClientFactory有四種模式:
- 基本用法
- 命名客戶端
- 類型化客戶端
- 生成的客戶端
基本用法
在 Startup.ConfigureServices 方法中,通過在 IServiceCollection 上調(diào)用 AddHttpClient 擴(kuò)展方法可以注冊(cè) IHttpClientFactory
services.AddHttpClient();
注冊(cè)之后可以像依賴注入DI似得在類中通過構(gòu)造函數(shù)注入形式使用,偽代碼:
class A
{
private readonly IHttpClientFactory _clientFactory;
public A(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
Public void Use()
{
var request=new HttpRequestMessage(HttpMethod.Get,"www.baidu.com") ;
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
Branches = await response.Content.ReadAsAsync<IEnumerable<GitHubBranch>>();
}
else
{
GetBranchesError = true;
Branches = Array.Empty<GitHubBranch>();
}
}
}
命名客戶端
也是在基本用法的基礎(chǔ)上增加配置參數(shù):例如增加一個(gè)baidu下的客戶端:
services.AddHttpClient("baidu",c=>
{
c.BaseAddress = new Uri("https://api.baidu.com/");
//其他一些參數(shù)
});
然后在使用的時(shí)候只是需要傳遞客戶端名稱就自動(dòng)使用baidu這個(gè)地址的基礎(chǔ)地址配置:
var client = _clientFactory.CreateClient("baidu");
類型化客戶端
說的明白一點(diǎn)就是在使用類的構(gòu)造函數(shù)中可以直接接受HttpClient 類型,不用在使用IHttpClientFactory 接口的CreateClient方法創(chuàng)建,但是首要條件就是要先創(chuàng)建注入類型,然后在ConfigureServices 方法同時(shí)注入:
services.AddHttpClient<classHttp>();
注入類型:
public class classHttp
{
public HttpClient Client { get; }
public GitHubService(HttpClient client)
{
client.BaseAddress = new Uri("https://api.baidu.com/");
//同ConfigureServices 中一樣設(shè)置一些其他參數(shù)
Client = client;
}
}
生成的客戶端
這個(gè)我個(gè)人理解為就是配置使用第三方庫(kù),然后可以注入接口類型,接口中可以寫一些方法接口。然后通過接口類直接調(diào)用接口。
個(gè)人理解:就是類似于一個(gè)接口映射,地址映射似得。通過結(jié)合第三方庫(kù)(官方推薦Refit)實(shí)現(xiàn)請(qǐng)求一個(gè)地址別名的方式,別名就是指定義的接口。然后別名通過增加特性Get(“路徑”)或者post("路徑)的形式重新指向真實(shí)的請(qǐng)求接口地址。通過請(qǐng)求這個(gè)本地接口方法實(shí)現(xiàn)轉(zhuǎn)化請(qǐng)求的真實(shí)地址。
舉例定義接口:
public interface IHelloClient
{
[Get("/MyInterFace")]
Task<Reply> GetMessageAsync();
}
配置Refit插件:
也是和正常配置類似,在后面增加接口的服務(wù)注入。
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("hello", c =>
{
c.BaseAddress = new Uri("http://localhost:5000");
})
.AddTypedClient(c => Refit.RestService.For<IHelloClient>(c));
services.AddMvc();
}
然后再說接口上面的Get("/MyInterFace")方法;這個(gè)我們就不做另一個(gè)項(xiàng)目就在當(dāng)前項(xiàng)目下,所以可以直接就在api項(xiàng)目下創(chuàng)建一個(gè)名為MyInterFace的方法。
[ApiController]
public class TestController : ControllerBase
{
[HttpGet("/")]
public async Task<sting> MyInterFace()
{
return "ceshi";
}
}
然后就可以使用接口了:
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IHelloClient _client;
public ValuesController(IHelloClient client)
{
_client = client;
}
[HttpGet("/")]
public async Task<ActionResult<Reply>> Index()
{
return await _client.GetMessageAsync();
}
}
在這了的_client.GetMessageAsync()方法就是調(diào)用了接口方法,看著是調(diào)用了GetMessageAsync方法其實(shí)是做了映射,映射地址就是上面特性寫的MyInterFace方法。通過斷點(diǎn)也可以驗(yàn)證此結(jié)論。然后不同項(xiàng)目下也是同一個(gè)意思,假如我們請(qǐng)求百度的地址:www.baidu.com/api/b這個(gè)接口
我們?cè)谂渲贸霭颜?qǐng)求地址http://localhost:5000改為www.baidu.com/api,然后再把GetMessageAsync方法上面的MyInterFace改為b即可。
出站請(qǐng)求中間件
個(gè)人理解為請(qǐng)求返回前處理程序,就是繼承 DelegatingHandler派生類重寫SendAsync 方法。在將請(qǐng)求傳遞至管道中的下一個(gè)處理程序之前執(zhí)行代碼:
public class ValidateHeaderHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (!request.Headers.Contains("X-API-KEY"))
{
return new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent(
"You must supply an API key header called X-API-KEY")
};
}
return await base.SendAsync(request, cancellationToken);
}
}
然后在ConfigureServices中:
services.AddTransient<ValidateHeaderHandler>();//注冊(cè)處理程序
services.AddHttpClient("externalservice", c =>
{
// Assume this is an "external" service which requires an API KEY
c.BaseAddress = new Uri("https://localhost:5000/");
})
.AddHttpMessageHandler<ValidateHeaderHandler>();/注入到http請(qǐng)求管道
可以同時(shí)注冊(cè)多個(gè)處理程序。
HttpClient和生存周期
每次對(duì) IHttpClientFactory 調(diào)用 CreateClient 都會(huì)返回一個(gè)新 HttpClient 實(shí)例。 每個(gè)命名的客戶端都具有一個(gè) HttpMessageHandler。 工廠管理 HttpMessageHandler 實(shí)例的生存期。
HttpClient實(shí)例不是與HttpMessageHandler一起銷毀的,HttpMessageHandler在池中生存,如果生命周期未到不會(huì)被銷毀,會(huì)被新的HttpClient 實(shí)例使用。
處理程序的默認(rèn)生存周期是2分鐘,可以通過配置修改:
services.AddHttpClient("extendedhandlerlifetime")
.SetHandlerLifetime(TimeSpan.FromMinutes(5));
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
欄 目:ASP.NET
下一篇:利用EF6簡(jiǎn)單實(shí)現(xiàn)多租戶的應(yīng)用
本文標(biāo)題:.Net Core下HTTP請(qǐng)求IHttpClientFactory示例詳解
本文地址:http://www.jygsgssxh.com/a1/ASP_NET/10874.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過程的方式


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子


