2017-01-31 4 views
0

UserHttpClientの各メソッドにデフォルトのヘッダーを設定したいが、すべてのメソッドがそれをやりたいとは思っていない。一般的なやり方でやりたい。各httpクライアントコールにデフォルトヘッダーを設定する

私が現在の実装で見られる問題は、1つのメソッドを呼び出すと、_clientがHttp要求内の次の呼び出し時にこのように配置され、_clientが初期化されていないことです。

UserHttpClientは、HTTPリクエストに従ってDI経由で登録されます。

私は_clientを渡してヘッダーを追加するプライベート/ベースメソッドを作成したくありません。

どのように問題を解決しますか?

public class UserHttpClient : IUserRemoteRepository 
    { 
     private readonly string baseUrl = ConfigurationManager.AppSettings["baseUrl"]; 
     private readonly string header = ConfigurationManager.AppSettings["userHeader"]; 

     private readonly HttpClient _client; 
     public ServiceProductDataProvider(string toolSystemKeyHeader) 
     { 
      _client = new HttpClient(); 
      _client.DefaultRequestHeaders.Add(header, token); 
     } 

     public async Task<List<UserDto>> GetUsers(UserRequestDto dto) 
     { 
      using (_client) 
      {    

       // do stuff 
       var users = await _client.GetAsync("url here"); 

      } 
     } 

     public async Task<UserDto> GetUser(Guid userId) 
     { 
      using (_client) 
      {    

       // do stuff 
       var users = await _client.GetAsync("url here"); 

      } 
     } 
    } 

答えて

0

クラスUserHttpClientIDisposableprivate readonly HttpClient _client;)である部材を有します。

public void Dispose() 
{ 
    _client.Dispose(); 
} 

その後、UserHttpClientを使用しているクラス/コードは、それはそれで完了だ後にそれを配置するための責任がある:それは、UserHttpClientIDisposableを実装する必要があることを意味します。インスタンスが挿入されている場合は、使用しているDIフレームワークが要求の最後に自動的に処理を処理する可能性があります。何のために残っていることは、単純な実装からusingブロックを削除することです:

public async Task<List<UserDto>> GetUsers(UserRequestDto dto) 
{ 
    // do stuff 
    var users = await _client.GetAsync("url here"); 
} 

---- EDIT ----

あなたはまた、ないHttpClientを再利用することで問題を回避することができ:

private string _toolSystemKeyHeader; 
public ServiceProductDataProvider(string toolSystemKeyHeader) 
{ 
    _toolSystemKeyHeader = toolSystemKeyHeader 
} 
private HttpClient GetClientInstance() 
{ 
    HttpClient _client = new HttpClient(); 
    _client.DefaultRequestHeaders.Add(header, _toolSystemKeyHeader); //?? in your original code, the toolSystemKeyHeader is not used, but I guess it is the token..? 
    return _client; 
} 

そして:

public async Task<List<UserDto>> GetUsers(UserRequestDto dto) 
{ 
    using (var _client = GetClientInstance()) 
    {    
     // do stuff 
     var users = await _client.GetAsync("url here"); 
    } 
} 
+0

あなたのポストを見る前にちょうど私がやった!まだありがとう!しかし、使用すると、私はエラーの場合にクライアントが処分されることを確かめることができますが、それを保証しない人は私にそれを保証しますか? – Pascal

+0

おそらくDIフレームワーク。しかし、あなたはそのドキュメントから見つける必要があります。 – user1429080

+0

私は現在HttpClientから継承しています。それはUserHttp呼び出しを行うhttp要求ごとのDI配線アップのために私にとって最善のようです。 – Pascal

関連する問題