2015-12-10 8 views
5

Ich habe den HttpClient seit einiger Zeit im Code verwendet und hatte immer das Gefühl, dass die Verwendung von Uris zu einiger Sprödigkeit in meiner Implementierung geführt hat. Die meisten unserer Service-Endpunkt-Basisadressen befinden sich in der app./web.config. Infolgedessen können sie leicht geändert werden.Verwenden von Uri-Strings, die möglicherweise trailing/'s haben

Ich habe festgestellt, dass wenn ich diese Endpunkte verwenden, um eine Uri zu generieren, wenn sie nicht in einem / enden, bekomme ich wirklich wonky Verhalten. Beim Aufruf GetAsync() mit einem nicht / -terminated BaseAddress, die resultierende verkettete URL, die die GET-Anfrage gesendet wird oft entweder die Zeichenfolge nach der letzten / in der BaseAddress, oder es wird die Zeichenfolge vor der ersten / in der GetUri fallen.

Zum Beispiel:

BaseAddress: http://test/serviceEndpoint

GetUri: api/customer

Wenn HttpClient.GetAsync() mit diesen GetUri aufgerufen wird, wird es versuchen, von http://test/api/customer zu bekommen. Wenn ich BaseAddress mit einem / verschließe, funktioniert alles wie erwartet.

Mein Problem ist, dassBaseAddress ist config-getrieben, und in der .config-Datei in einem Kommentar setzen sagen: „Stellen Sie sicher, dass Sie alle Service-URLs mit einem / Ende!“ ist eine wirklich spröde Lösung.

Also habe ich angewöhnt, in allen meinen HttpClient Konstruktion den folgenden Code verwenden:

 var service = settings.GetValue("ServiceBaseUrl"); 
     var serviceUri = !service.EndsWith("/") 
      ? new Uri(service + "/") 
      : new Uri(service); 

     _client = new HttpClient 
     { 
      BaseAddress = serviceUri 
     };` 

Während dies nicht spröde ist, fühlt es sich wiederholende es in jedem HttpClient Konstruktor zu haben. Gibt es etwas in HttpClient oder Uri, das ich verwenden kann, um diesen Standardcode zu vermeiden?

+0

Sie können versuchen, die Logik in einer Erweiterungsmethode zu umhüllen, die Menge an Wiederholungen zu reduzieren. Und Sie würden var serviceUri = service.GetBaseURL() in Ihrer App verwenden. https://msdn.microsoft.com/en-us/library/bb383977.aspx – Paul

+0

Nur ein Rand Fall gedacht: 'ServiceUri = Service.TrimEnd ('/') + "/" 'würde Situationen erfassen, in denen das' ServiceBaseUrl' mit mehr als einem '/' endet und Situationen, in denen es nicht mit einem '/' endet. – test

Antwort

2

Es gibt nichts in HttpClient oder Uri, um dies zu adressieren, weshalb ich es in ein paar Weisen in Flurl adressiert habe. Flurls AppendPathSegment und AppendPathSegments Methoden gewährleisten ein und nur ein "/" Trennzeichen zwischen den Segmenten. Beispielsweise ergeben diese die gleichen Ergebnisse:

"http://mysite/".AppendPathSegment("/endpoint") 
"http://mysite".AppendPathSegment("endpoint") 

Die statischen Url.Combine Verfahren auch dieses Verhalten hat, wie eine Art von Path.Combine für URLs handeln. Diese und andere hilfreiche URL-building-Bits sind im Kernpaket Flurl verfügbar, aber der wahre Spaß ist in Flurl.Http, die den fließenden URL-Builder mit einem leichten Wrapper auf HttpClient und Json.NET kombiniert, der Sie gehen lässt von String HTTP-Anforderung an deserialisiert Ergebnis URL ohne Stift vom Papier zu heben, so zu sprechen:

var result = await settings.GetValue("ServiceBaseUrl") 
    .AppendPathSegment("endpoint") 
    .GetJsonAsync<T>(); 
+0

Das ist nett, danke für den Vorschlag! –