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?
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
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