0

私はウェブアプリケーションを持っています。パフォーマンスのボトルネックは、リクエストごとに Http クライアントを何度も作成している可能性があることがわかりました。

public static class DemoHttpClient
    {
       public static HttpClient GetClient()
       {
           HttpClient client = new HttpClient();
           client.BaseAddress = new Uri(DemoConstants.DemoAPI);
           client.DefaultRequestHeaders.Accept.Clear();
           client.DefaultRequestHeaders.Accept.Add(
                new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

           return client;
}
    }

public class DemoConstants
{
    public const string DemoAPI = "http://localhost/";
}

これにはシングルトンを実装する予定です。そして、この非常に役立つ記事を見つけました。 http://csharpindepth.com/Articles/General/Singleton.aspx

ASP.NET MVC Web アプリケーションのライフサイクルがサーバーにデプロイされたときの正確な状態について、私は混乱しています。同じリソースを呼び出す複数のスレッドがあると仮定すると、リソースはさらに何度も新しい http クライアントを作成します。

ここで何をすべきか.. 1) HTTP クライアントを遅延ロードしますか? 2) 遅延ロードしませんか?

どの特定のアプローチを使用する必要がありますか?

4

1 に答える 1

0

これは良い考えとは思えません。特に、HttpClientクラスのドキュメントをのぞいてみてください:

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

https://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.118%29.aspx

これは、複数のスレッドからまったく同じシングルトン インスタンスにアクセスすると、未定義の問題が発生することを意味します。

ただし、できることは、単一のリクエストで同じインスタンスを再利用できることです。Itemsこれは、コンテナにインスタンスを格納することで実行できます。

   private static string ITEMSKEY = "____hclient";

   public static HttpClient GetClient()
   {
       if ( HttpContext.Current.Items[ITEMSKEY] == null )
       {
          HttpClient client = new HttpClient();
          client.BaseAddress = new Uri(DemoConstants.DemoAPI);
          client.DefaultRequestHeaders.Accept.Clear();
          client.DefaultRequestHeaders.Accept.Add(
            new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

          HttpContext.Current.Items.Add( ITEMSKEY, client );
       }

       return (HttpClient)HttpContext.Current.Items[ITEMSKEY];
    }

HttpClientを実装しているため、アプリケーション パイプラインIDisposableの場合など、パイプラインのどこかにそのようなインスタンスを配置することをお勧めします。EndRequest

更新: @LukeH のコメントに記載されているように、.NET 4.5 および 4.6 のドキュメントの更新版には、HttpClientクラスのメソッドの一部スレッド セーフであると記載されています。

https://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.110%29.aspx

更新された備考セクションでは、単一のインスタンスは基本的に、このインスタンスによって実行されるすべてのリクエストに適用される共有設定のコレクションであると述べています。次に、ドキュメントには次のように記載されています。

さらに、すべての HttpClient インスタンスは独自の接続プールを使用して、その要求を他の HttpClient インスタンスによって実行される要求から分離します。

これは、異なるプールの分離が依然として理にかなっている可能性があることを意味します。私の個人的な推奨事項は、連続するリクエスト間でいくつかの設定を変更する必要がある可能性があるため、シングルトンを持たないことです。

于 2015-11-10T13:07:40.697 に答える