如果我Uri
使用UriBuilder
这样创建一个:
var rootUrl = new UriBuilder("http", "example.com", 50000).Uri;
随后AbsoluteUri
的rootUrl
总是包含这样的斜线:
http://example.com:50000/
我想要的是创建一个Uri
不带斜杠的对象,但这似乎是不可能的。
我的解决方法是将其存储为字符串,然后执行如下操作:
var rootUrl = new UriBuilder("http", "example.com", 50000).Uri.ToString().TrimEnd('/');
我听说有人说没有尾随的斜杠,Uri是无效的。我认为那不是真的。我查看了RFC 3986,并在3.2.2节中说:
如果URI包含授权组件,则路径组件必须为空或以斜杠(“ /”)开头。
它并不表示必须在末尾加斜杠。
在任意URI中不需要尾部斜杠,但是它是HTTP中请求的绝对URI规范表示的一部分:
注意绝对路径不能为空;如果原始URI中没有任何内容,则必须将其指定为“ /”(服务器根目录)。
为了遵守规范,Uri
该类以带斜杠的形式输出URI:
通常,使用通用语法授权具有空路径的URI应该标准化为路径“ /”。
无法Uri
在.NET中的对象上配置此行为。当发送对具有空路径的URL的请求时,Web浏览器和许多HTTP客户端执行相同的重写。
如果我们想在内部将URL表示为一个Uri
对象而不是一个字符串,则可以创建一个扩展方法来格式化URL,且不带斜杠,从而将该表示逻辑抽象到一个位置,而不是每次需要输出时都复制它。显示网址:
namespace Example.App.CustomExtensions
{
public static class UriExtensions
{
public static string ToRootHttpUriString(this Uri uri)
{
if (!uri.IsHttp())
{
throw new InvalidOperationException(...);
}
return uri.Scheme + "://" + uri.Authority;
}
public static bool IsHttp(this Uri uri)
{
return uri.Scheme == "http" || uri.Scheme == "https";
}
}
}
然后:
using Example.App.CustomExtensions;
...
var rootUrl = new UriBuilder("http", "example.com", 50000).Uri;
Console.WriteLine(rootUrl.ToRootHttpUriString()); // "http://example.com:50000"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句