如果我使用Uri
创建UriBuilder
,请执行以下操作:
var rootUrl = new UriBuilder("http", "example.com", 50000).Uri;
然后AbsoluteUri
的{{1}}总是包含这样的尾部斜杠:
rootUrl
我想要的是创建一个没有斜杠的http://example.com:50000/
对象,但似乎不可能。
我的解决方法是将其存储为字符串,并做一些丑陋的事情:
Uri
我听过有人说没有尾随斜线,Uri无效。我不认为这是真的。我查看了RFC 3986,并在3.2.2节中说:
如果URI包含授权组件,那么路径组件 必须为空或以斜杠(" /")字符开头。
并不是说尾随斜线必须在那里。
答案 0 :(得分:4)
任意URI中的尾部斜杠不是 required ,但它是请求in HTTP的绝对URI的规范表示的一部分:< / p>
注意绝对路径不能为空;如果原始URI中不存在,则必须以“/”(服务器根目录)给出。
要遵守the spec,Uri
类会在表单中输出带有斜杠的URI:
通常,使用具有空路径的权限的通用语法的URI应规范化为“/".
的路径。
在.NET中的Uri
对象上无法配置此行为。当发送具有空路径的URL请求时,Web浏览器和许多HTTP客户端执行相同的重写。
如果我们想在内部将我们的URL表示为Uri
对象而不是字符串,我们可以创建一个extension method来格式化URL而不使用尾部斜杠,这会将此表示逻辑抽象在一个位置而不是每当我们需要输出显示的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"
答案 1 :(得分:2)
您可以使用Uri.GetComponents
方法:
rootUrl.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped)
哪个会返回string
个Uri
个不同组件的代表,在这种情况下,UriComponents.SchemeAndServer
表示方案, host < / em>和 port 组件。
您可以在MSDN上阅读更多相关信息: