我已经在代码中使用HttpClient一段时间了,并且一直觉得它的使用Uris
导致了我的实现中的一些脆弱性.我们的大多数服务端点基地址都在app./web.config中.结果,它们可以很容易地改变.
我发现当使用这些端点字符串生成a时Uri
,如果它们不以a结尾/
,我会得到非常不稳定的行为.当调用GetAsync()
与非/
封端的BaseAddress
,即常发送的GET请求所得级联URL后最终下降任一字符串/
中的BaseAddress
,或者它会下降字符串前述第一/
在GetUri.
例如:
BaseAddress
: http://test/serviceEndpoint
GetUri
: api/customer
当HttpClient.GetAsync()
用GetUri
它调用时,它将尝试从中获取http://test/api/customer
.如果我BaseAddress
用a 封顶/
,一切都按预期工作.
我的问题是BaseAddress
配置驱动,并在.config文件中添加注释,说"请确保使用/
!结束所有服务URL ".是一个非常脆弱的解决方案.
所以我养成了在我的所有HttpClient
构造中使用以下代码的习惯:
var service = settings.GetValue("ServiceBaseUrl"); var serviceUri = !service.EndsWith("/") ? new Uri(service + "/") : new Uri(service); _client = new HttpClient { BaseAddress = serviceUri };`
虽然这不易碎,但在每个HttpClient
构造函数中都有重复性.是否有任何东西HttpClient
或Uri
我可以用来避免这个样板代码?