2016-12-09 30 views
0

私はHttpClientのシングルトンインスタンスを使用して呼び出しを行っています。私はHttpClientが有効であるかどうかテストする方法があるのだろうかと思っていましたか?新しいインスタンスを作成する必要があるアプリケーションの使用中に、HttpClientのこのインスタンスが悪くなる可能性があります。私のコードは次のとおりです。シングルトンHttpClientの処理

public class HttpClientWrapper : IHttpClientWrapper 
{ 
    private Uri _baseAddress; 
    private int _connectionTimeout; 
    private HttpClient _httpClientInstance; 
    private HttpClient HttpClientInstance 
    { 
     get 
     { 
      if (_httpClientInstance == null) 
       _httpClientInstance = CreateHttpClient(); 
      return _httpClientInstance; 
     } 
    } 
    public HttpClientWrapper(Uri baseAddress, int connectionTimeout) 
    { 
     _baseAddress = baseAddress; 
     _connectionTimeout = connectionTimeout; 
    } 
    public Task<HttpResponseMessage> PostAsJsonAsync<T>(string requestUri, T  value) 
    { 
     //Test the instance before using it. What should be the test?? 
     return HttpClientInstance.PostAsJsonAsync<T>(requestUri, value); 
    } 

    private HttpClient CreateHttpClient() 
    { 
     HttpClientHandler handler = new HttpClientHandler() 
     { 
      UseDefaultCredentials = true 
     }; 
     HttpClient client = new HttpClient(handler); 
     client.Timeout = TimeSpan.FromMilliseconds(_connectionTimeout); 
     client.BaseAddress = _baseAddress; 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     return client; 
    } 
} 

答えて

0

HttpClientは再利用できるように設計されています。 WCFやChannelFactoryの昔のようなものではありません。チャンネルは障害のある状態になり、再現されなければなりませんでした。

のHttpClientが一度インスタンス化されることを意図され、アプリケーションの寿命を通じて再使用。特にサーバーアプリケーションでは、すべての要求に対して新しいHttpClientインスタンスを作成すると、負荷の高い状態で使用可能なソケットの数が使い果たされます。これにより、SocketExceptionエラーが発生します。

参考:https://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

+0

おかげでマイケルは、私はHttpClientをを再利用しながら、クライアントが使用中壊れて行くと、それを識別するための方法があるん不思議でしたか?言い換えれば、アプリケーションの使用中にアプリケーションで使用されているHttpClientのシングルトンインスタンスを再インスタンス化する理由がありますか? – Barbara

+0

いいえ、 'HttpClient'を再インスタンス化する必要はありません。私が知っている限り、HttpClientはステートレスです。 – Michael

関連する問題