C# 使用可能有或可能没有尾随/';s

C# 使用可能有或可能没有尾随/';s,c#,uri,dotnet-httpclient,C#,Uri,Dotnet Httpclient,我在代码中使用HttpClient已经有一段时间了,并且一直觉得它对uri的使用导致了我的实现的一些脆弱性。我们的大多数服务端点基址都在app./web.config中。因此,它们很容易改变 我发现,当使用这些端点字符串生成Uri时,如果它们不以/结尾,我会得到非常不稳定的行为。当使用非/终止的基地址调用GetAsync()时,发送GET请求的结果连接URL通常会删除基地址中最后一个/之后的字符串,或者删除GetUri中第一个/之前的字符串 例如: BaseAddress:http://test

我在代码中使用HttpClient已经有一段时间了,并且一直觉得它对
uri
的使用导致了我的实现的一些脆弱性。我们的大多数服务端点基址都在app./web.config中。因此,它们很容易改变

我发现,当使用这些端点字符串生成
Uri
时,如果它们不以
/
结尾,我会得到非常不稳定的行为。当使用非
/
终止的
基地址调用
GetAsync()
时,发送GET请求的结果连接URL通常会删除
基地址中最后一个
/
之后的字符串,或者删除GetUri中第一个
/
之前的字符串

例如:

BaseAddress
http://test/serviceEndpoint

GetUri
api/customer

当使用该
GetUri
调用
HttpClient.GetAsync()
时,它将尝试从
http://test/api/customer
。如果我用
/
标记
基地址
,则一切正常

我的问题是
BaseAddress
是配置驱动的,在.config文件中添加一条注释“确保用
/
!”是一个非常脆弱的解决方案

因此,我养成了在所有
HttpClient
构造中使用以下代码的习惯:

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

        _client = new HttpClient
        {
            BaseAddress = serviceUri
        };`

虽然这并不脆弱,但在每个
HttpClient
构造函数中使用它感觉是重复的。在
HttpClient
Uri
中有什么东西可以用来避免这个样板代码吗?

在HttpClient或Uri中没有任何东西可以解决这个问题,这就是为什么我在本文中以两种方式解决它。Flurl的
AppendPathSegment
AppendPathSegments
方法将确保段之间只有一个“/”分隔符。例如,它们产生相同的结果:

"http://mysite/".AppendPathSegment("/endpoint")
"http://mysite".AppendPathSegment("endpoint")
静态
Url.Combine
方法也有此行为,充当Url的
路径.Combine

核心包中提供了这些和其他有用的URL构建功能,但真正的乐趣在于,它将fluent URL builder与HttpClient和Json.NET之上的轻量级包装结合在一起,可以让您从字符串到URL再到HTTP请求再到反序列化结果,而无需从纸上拿起笔,也就是说:

var result = await settings.GetValue("ServiceBaseUrl")
    .AppendPathSegment("endpoint")
    .GetJsonAsync<T>();
var result=wait settings.GetValue(“ServiceBaseUrl”)
.AppendPathSegment(“端点”)
.GetJsonAsync();

您可以尝试将逻辑封装在扩展方法中,以减少重复次数。您可以在整个应用程序中使用var serviceUri=service.GetBaseURL()。仅仅是一个边缘案例:
serviceUri=service.TrimEnd(“/”)+“/”
将捕获
ServiceBaseUrl
以多个
/
结尾的情况,以及它没有以
/
结尾的情况。