最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為HttpClient添加默認(rèn)請求報頭的四種解決方案

 更新時間:2019年09月05日 09:44:52   作者:蔣金楠  
這篇文章主要給大家介紹了關(guān)于為HttpClient添加默認(rèn)請求報頭的四種解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用HttpClient具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

HttpClient在Web調(diào)用中具有廣泛的應(yīng)用,而為它添加默認(rèn)請求頭是我們經(jīng)常遇到的需求,本文介紹4種為HttpClient添加默認(rèn)請求頭的方式。下面話不多說了,來一起看看詳細(xì)的介紹吧

第一種方式

直接在創(chuàng)建的HttpClient對象的DefaultRequestHeaders集合中添加報頭。

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");
  }
}

第二種方式

對于.NET Core應(yīng)用來說,我們更推薦的做法是采用依賴注入的方式,利用IHttpClientFactory來創(chuàng)建HttpClient對象,那么我們在進(jìn)行相關(guān)服務(wù)注冊的時候就可以設(shè)置默認(rèn)請求報頭。

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ā)送請求的時候會利用DiagnosticSource對象發(fā)送相應(yīng)的診斷事件,并且將作為請求的HttpRequestMessage對象作為請求事件內(nèi)容負(fù)載。我們可以訂閱該事件,在請求被發(fā)送之前將其攔截下來,并添加相應(yī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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • asp.net下加密Config的方法

    asp.net下加密Config的方法

    本文說明使用RSAProtectedConfigurationProvidert和計算機(jī)級別的密鑰容器進(jìn)行加密的步驟。
    2011-02-02
  • Entity Framework使用Code First模式管理視圖

    Entity Framework使用Code First模式管理視圖

    本文詳細(xì)講解了Entity Framework使用Code First模式管理視圖的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • GridView多層嵌套和折疊與展開(修改適合自己使用)

    GridView多層嵌套和折疊與展開(修改適合自己使用)

    這個功能的GridView多層嵌套沒有問題,因為已經(jīng)做了無限次數(shù),但是折疊與展開的功能,卻花上不少時間(網(wǎng)上找資料),雖找到資料可參考,還是了解明它,并修改適合自己程序使用,感興趣的朋友可以了解下
    2013-01-01
  • ASP.NET過濾器的應(yīng)用方法介紹

    ASP.NET過濾器的應(yīng)用方法介紹

    ASP.NET過濾器的應(yīng)用方法介紹,需要的朋友可以參考一下
    2013-06-06
  • WPF制作一個簡單的倒計時器實例附源碼

    WPF制作一個簡單的倒計時器實例附源碼

    既然早上沒事干,于是想到前些日子學(xué)院的某個老師讓大家給他找個什么倒計時的小軟件;何不寫個玩玩~既然要寫,就用以前沒怎么搗鼓過的WPF寫一個倒計時器,需要了解的朋友可以參考下
    2012-12-12
  • asp.net基于HashTable實現(xiàn)購物車的方法

    asp.net基于HashTable實現(xiàn)購物車的方法

    這篇文章主要介紹了asp.net基于HashTable實現(xiàn)購物車的方法,涉及asp.net中HashTable結(jié)合session實現(xiàn)購物車功能的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • C#中efcore-ShardingCore呈現(xiàn)“完美”分表

    C#中efcore-ShardingCore呈現(xiàn)“完美”分表

    本文簡單的介紹了efcore的分表,著重介紹了efcore下最完美的分表組件ShardingCore,可以幫助大家更好的學(xué)習(xí),感興趣的小伙伴可以參考一下
    2021-08-08
  • ASP.NET?MVC使用JCrop上傳并裁剪圖片

    ASP.NET?MVC使用JCrop上傳并裁剪圖片

    這篇文章介紹了ASP.NET?MVC使用JCrop上傳并裁剪圖片的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • asp.net操作javascript:confirm返回值的兩種方式

    asp.net操作javascript:confirm返回值的兩種方式

    asp.net操作javascript:confirm返回值分為兩種,不使用ajax、使用了ajax,不使用ajax,可以用StringBuilder來完成
    2014-09-09
  • asp.NET中實現(xiàn)文件的壓縮和解壓(3種方式)

    asp.NET中實現(xiàn)文件的壓縮和解壓(3種方式)

    本篇文章主要介紹了asp.NET中實現(xiàn)文件的壓縮和解壓,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2016-11-11

最新評論

临沭县| 新和县| 五常市| 留坝县| 嵩明县| 东平县| 荆州市| 巴彦淖尔市| 德阳市| 酉阳| 兴海县| 黎平县| 玉龙| 石泉县| 诏安县| 大兴区| 榆林市| 昆明市| 西丰县| 黑水县| 正蓝旗| 绵阳市| 弥渡县| 永丰县| 马尔康县| 郑州市| 溧水县| 汶上县| 左贡县| 西藏| 垣曲县| 沐川县| 万荣县| 瓦房店市| 龙川县| 通道| 嘉善县| 大英县| 丽水市| 沈丘县| 定兴县|