2015-12-10 19 views
5

Şu an HttpClient kodunu bir süredir kullanıyorum ve her zaman kullanmam için Uris kullanımının bazı kırılganlıklara neden olduğunu hissettim. Servis uç nokta taban adreslerimizin çoğu app./web.config dosyasındadır. Sonuç olarak, kolayca değiştirilebilirler.Takip eden/bırakamayan Uri dizelerini kullanma

Bu uç nokta dizelerini Uri oluşturmak için kullanırken, / içinde bitmezlerse gerçekten çok kaba davranışlar elde ettiğimi buldum. Bir sivil / nihayetti BaseAddress ile GetAsync() ararken, genellikle GET isteği gönderilir çıkan birleştirilmiş URL BaseAddress final / sonra dize ya düşer, ya da GetUri ilk / -Önceki dize düşecek. Örneğin

:

BaseAddress: http://test/serviceEndpoint

GetUri: api/customerHttpClient.GetAsync() o GetUri ile çağrılır

, bu http://test/api/customer gelen GET çalışacaktır. / ile BaseAddress kapsayıcam, her şey beklendiği gibi çalışır.

Sorunum olduğunu BaseAddress olmasıdır tahrik-config, diyerek .config dosyasındaki bir yorumda koyarak "Bir / tüm Servis URL'leri emin ol!" gerçekten kırılgan bir çözümdür.

Yani benim HttpClient inşaatın tüm aşağıdaki kodu kullanma alışkanlığı içine kazanılmış ettik: Bu kırılgan olmasa da

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

     _client = new HttpClient 
     { 
      BaseAddress = serviceUri 
     };` 

, her HttpClient oluşturucu içinde olmasını tekrarlayan hisseder. Bu boilerplate kodundan kaçınmak için kullanabileceğim HttpClient veya Uri'da bir şey var mı?

+0

Sen tekrarı miktarını azaltmak için bir uzantısı yöntemindeki mantığı sarmak için deneyebilirsiniz. Ve uygulamanızın içinden var serviceUri = service.GetBaseURL() kullanırsınız. https://msdn.microsoft.com/en-us/library/bb383977.aspx – Paul

+0

Sadece bir durum düşüncesi: 'serviceUri = service.TrimEnd ('/') + "/" '' ServiceBaseUrl '' nin birden fazla '' 'ile bittiği ve'/'ile bitmediği durumları yakalar. – test

cevap

2

HttpClient veya Uri'de bunu ele almak için hiçbir şey yoktur, bu yüzden onu Flurl içinde birkaç şekilde ele aldım. Flurl'ün AppendPathSegment ve AppendPathSegments yöntemleri, segmentler arasında bir ve sadece bir "/" ayırıcı sağlayacaktır.

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

statik Url.Combine yöntem

da URL'ler için bir Path.Combine tür olarak hareket eden, bu davranışı vardır: Örneğin, bu aynı sonuçları verir.

Bu ve diğer yararlı URL bina bit çekirdek Flurl pakette mevcuttur ancak asıl eğlence dek bağlıyor HttpClient üstünde ve Json.NET üzerine hafif sarmalayıcı ile akıcı URL oluşturucu birleştiren Flurl.Http, olduğu dizesinden tabiri caizse, kağıttan kalem kaldırmadan serileştirilemezse sonuca HTTP isteğine URL'ye:

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

Bu güzel, öneri için teşekkürler! –