為HttpClient添加默認(rèn)請(qǐng)求報(bào)頭的四種解決方案
前言
HttpClient在Web調(diào)用中具有廣泛的應(yīng)用,而為它添加默認(rèn)請(qǐng)求頭是我們經(jīng)常遇到的需求,本文介紹4種為HttpClient添加默認(rèn)請(qǐng)求頭的方式。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
第一種方式
直接在創(chuàng)建的HttpClient對(duì)象的DefaultRequestHeaders集合中添加報(bào)頭。
class Program
{
static Task Main()=> SendAsync1();
private static async Task SendAsync1()
{
var httpClient = new HttpClient();
AddDefaultHeaders(httpClient);
await httpClient.GetStringAsync("http://localhost:5000/");
}
private static void AddDefaultHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");
}
}
第二種方式
對(duì)于.NET Core應(yīng)用來(lái)說(shuō),我們更推薦的做法是采用依賴注入的方式,利用IHttpClientFactory來(lái)創(chuàng)建HttpClient對(duì)象,那么我們?cè)谶M(jìn)行相關(guān)服務(wù)注冊(cè)的時(shí)候就可以設(shè)置默認(rèn)請(qǐng)求報(bào)頭。
class Program
{
static Task Main()=> SendAsync2();
private static async Task SendAsync2()
{
var services = new ServiceCollection();
services.AddHttpClient("", AddDefaultHeaders);
var httpClient = services
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>()
.CreateClient();
await httpClient.GetStringAsync("http://localhost:5000/");
}
private static void AddDefaultHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");
}
}
第三種方式
由于HttpClient在發(fā)送請(qǐng)求的時(shí)候會(huì)利用DiagnosticSource對(duì)象發(fā)送相應(yīng)的診斷事件,并且將作為請(qǐng)求的HttpRequestMessage對(duì)象作為請(qǐng)求事件內(nèi)容負(fù)載。我們可以訂閱該事件,在請(qǐng)求被發(fā)送之前將其攔截下來(lái),并添加相應(yīng)的請(qǐng)求頭即可。
class Program
{
static Task Main()=> SendAsync3();
private static async Task SendAsync3()
{
Func<object, HttpRequestMessage> requestAccessor = null;
DiagnosticListener.AllListeners.Subscribe(listener =>
{
if (listener.Name == "HttpHandlerDiagnosticListener")
{
listener.Subscribe(kv =>
{
if (kv.Key == "System.Net.Http.HttpRequestOut.Start")
{
requestAccessor ??= BuildRequestAccessor(kv.Value.GetType());
var request = requestAccessor(kv.Value);
AddDefaultHeaders(request);
}
});
}
});
var httpClient = new HttpClient();
await httpClient.GetStringAsync("http://localhost:5000/");
static Func<object, HttpRequestMessage> BuildRequestAccessor(Type payloadType)
{
var property = payloadType.GetProperty("Request", BindingFlags.Instance | BindingFlags.Public);
var payload = Expression.Parameter(typeof(object));
var convertedPayload = Expression.Convert(payload, payloadType);
var getRequest = Expression.Call(convertedPayload, property.GetMethod);
var convert = Expression.Convert(getRequest, typeof(HttpRequestMessage));
return Expression.Lambda<Func<object, HttpRequestMessage>>(convert, payload).Compile();
}
}
private static void AddDefaultHeaders(HttpRequestMessage request)
{
request.Headers.Add("x-www-foo", "123");
request.Headers.Add("x-www-bar", "456");
request.Headers.Add("x-www-baz", "789");
}
}
第四種方式
上面這種方式可以采用強(qiáng)類型編程方式,具體的代碼如下。
class Program
{
static Task Main()=> SendAsync4();
private static async Task SendAsync4()
{
DiagnosticListener.AllListeners.Subscribe(listener =>
{
if (listener.Name == "HttpHandlerDiagnosticListener")
{
listener.SubscribeWithAdapter(new HttpClientListener());
}
});
var httpClient = new HttpClient();
await httpClient.GetStringAsync("http://localhost:5000/");
}
private sealed class HttpClientListener
{
[DiagnosticName("System.Net.Http.HttpRequestOut.Start")]
public void OnSend(HttpRequestMessage request) => AddDefaultHeaders(request);
//Must subscribute the System.Net.Http.HttpRequestOut event.
[DiagnosticName("System.Net.Http.HttpRequestOut")]
public void OnSend() { }
}
private static void AddDefaultHeaders(HttpRequestMessage request)
{
request.Headers.Add("x-www-foo", "123");
request.Headers.Add("x-www-bar", "456");
request.Headers.Add("x-www-baz", "789");
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
上一篇:ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過(guò)程
欄 目:ASP.NET
下一篇:沒有了
本文標(biāo)題:為HttpClient添加默認(rèn)請(qǐng)求報(bào)頭的四種解決方案
本文地址:http://www.jygsgssxh.com/a1/ASP_NET/10879.html


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(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ī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改


