Base Uri没有尾部斜杠

时间:2017-10-27 05:39:41

标签: c# .net url uri

如果我使用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包含授权组件,那么路径组件      必须为空或以斜杠(" /")字符开头。

并不是说尾随斜线必须在那里。

2 个答案:

答案 0 :(得分:4)

任意URI中的尾部斜杠不是 required ,但它是请求in HTTP的绝对URI的规范表示的一部分:< / p>

  

注意绝对路径不能为空;如果原始URI中不存在,则必须以“/”(服务器根目录)给出。

要遵守the specUri类会在表单中输出带有斜杠的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)

哪个会返回stringUri个不同组件的代表,在这种情况下,UriComponents.SchemeAndServer表示方案 host < / em>和 port 组件。

您可以在MSDN上阅读更多相关信息:

  1. Uri.GetComponents

  2. UriComponents

  3. UriFormat