2017-01-31 3 views
0

Ich möchte eine Standard-Header für jede Methode in der UserHttpClient festlegen, aber ich will nicht, dass jede Methode macht das, ich möchte es in einer allgemeinen Weise tun.Legen Sie eine Standard-Header für jeden HTTP-Client-Aufruf

Das Problem sehe ich bei der aktuellen Implementierung, dass beim Aufruf einer Methode der _client also beim nächsten Aufruf innerhalb einer Http-Anfrage entsorgt wird, der _client nicht initialisiert wird, da dies innerhalb des Konstruktors geschieht.

Der UserHttpClient wird über DI gemäß Http Request registriert.

Ich möchte auch nicht eine private/Basis-Methode erstellen, wo ich den _client übergeben und den Header dort hinzufügen.

Wie würden Sie dieses Problem lösen?

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

      } 
     } 
    } 

Antwort

0

Die Klasse UserHttpClient hat ein Element, das IDisposable (private readonly HttpClient _client;) ist. Das bedeutet, dass die UserHttpClient auch IDisposable implementieren sollten:

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

Dann wird die Klasse/Code, der für Entsorgung es UserHttpClient ist verantwortlich verwendet, nachdem sie mit ihm fertig ist. Wenn die Instanz injiziert wird, behandelt das DI-Framework, das Sie verwenden, es möglicherweise am Ende der Anfrage automatisch. Was ist für Sie übrig bleibt, ist dann einfach die using Blöcke aus der Umsetzung zu entfernen:

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

---- ---- EDIT

Sie auch das Problem umgehen, könnte durch nicht die HttpClient Wiederverwendung :

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

Und:

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

Genau das habe ich getan, bevor ich deinen Beitrag gesehen habe! Trotzdem danke! aber bei der nutzung kann ich sicher sein, dass der client in einem fehlerfall entsorgt wird, aber ohne zu nutzen wer garantiert mir das? – Pascal

+0

Das DI-Framework wahrscheinlich. Aber das müsstest du aus seiner Dokumentation herausfinden. – user1429080

+0

Ich erben jetzt von HttpClient. Das scheint mir am besten zu sein für die DI-Verkabelung per HTTP-Anfrage, die den UserHttp-Anruf ausführt. – Pascal

Verwandte Themen