2017-01-31 12 views
0

Я хочу установить заголовок по умолчанию для каждого метода в UserHttpClient, но я не хочу, чтобы каждый метод делал это, я хочу сделать это в общем виде.Установите заголовок по умолчанию для каждого клиентского вызова http

Проблема, которую я вижу в текущей реализации, заключается в том, что когда я вызываю один метод, _client получает расположение таким образом при следующем вызове в запросе Http, _client не инициализируется, так как это происходит внутри конструктора.

UserHttpClient зарегистрирован через DI согласно запросу Http.

Я также не хочу создавать частный/базовый метод, где передаю _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

Класс UserHttpClient имеет элемент, который IDisposable (private readonly HttpClient _client;). Это означает, что UserHttpClient также следует осуществлять IDisposable:

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

Тогда класс/код, который использует UserHttpClient отвечает за Располагая его после того, как это сделано с ним. Если экземпляр инъецируется, тогда используемая среда 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. Это кажется лучшим для меня для проводки DI для каждого запроса HTTP, выполняющего вызов UserHttp. – Pascal