當前位置:編程學習大全網 - 編程語言 - httphandler設置自定義請求頭

httphandler設置自定義請求頭

4種為HttpClient添加默認請求頭的方式。下面詳細的介紹;

第壹種方式

直接在創建的HttpClient對象的DefaultRequestHeaders集合中添加報頭。

class Program

{undefined

static Task Main()=> SendAsync1();

private static async Task SendAsync1()

{undefined

var httpClient = new HttpClient();

AddDefaultHeaders(httpClient);

await httpClient.GetStringAsync("http://localhost:5000/");

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");

httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");

httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");

}

}

第二種方式

對於.NET Core應用來說,我們更推薦的做法是采用依賴註入的方式,利用IHttpClientFactory來創建HttpClient對象,那麽我們在進行相關服務註冊的時候就可以設置默認請求報頭。

class Program

{undefined

static Task Main()=> SendAsync2();

private static async Task SendAsync2()

{undefined

var services = new ServiceCollection();

services.AddHttpClient("", AddDefaultHeaders);

var httpClient = services

.BuildServiceProvider()

.GetRequiredService()

.CreateClient();

await httpClient.GetStringAsync("http://localhost:5000/");

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");

httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");

httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");

}

}

第三種方式

由於HttpClient在發送請求的時候會利用DiagnosticSource對象發送相應的診斷事件,並且將作為請求的HttpRequestMessage對象作為請求事件內容負載。我們可以訂閱該事件,在請求被發送之前將其攔截下來,並添加相應的請求頭即可。

class Program

{undefined

static Task Main()=> SendAsync3();

private static async Task SendAsync3()

{undefined

Func requestAccessor = null;

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.Subscribe(kv =>

{undefined

if (kv.Key == "System.Net.Http.HttpRequestOut.Start")

{undefined

requestAccessor ?= BuildRequestAccessor(kv.Value.GetType());

var request = requestAccessor(kv.Value);

AddDefaultHeaders(request);

}

});

}

});

var httpClient = new HttpClient();

await httpClient.GetStringAsync("http://localhost:5000/");

static Func BuildRequestAccessor(Type payloadType)

{undefined

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>(convert, payload).Compile();

}

}

private static void AddDefaultHeaders(HttpRequestMessage request)

{undefined

request.Headers.Add("x-www-foo", "123");

request.Headers.Add("x-www-bar", "456");

request.Headers.Add("x-www-baz", "789");

}

}

第四種方式

上面這種方式可以采用強類型編程方式,具體的代碼如下。

class Program

{undefined

static Task Main()=> SendAsync4();

private static async Task SendAsync4()

{undefined

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.SubscribeWithAdapter(new HttpClientListener());

}

});

var httpClient = new HttpClient();

await httpClient.GetStringAsync("http://localhost:5000/");

}

private sealed class HttpClientListener

{undefined

[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)

{undefined

request.Headers.Add("x-www-foo", "123");

request.Headers.Add("x-www-bar", "456");

request.Headers.Add("x-www-baz", "789");

}

}

  • 上一篇:馬斯克啟示錄:造車新勢力的夢想與現實
  • 下一篇:華中科技大學人工智能專業考研經驗分享?
  • copyright 2024編程學習大全網