c# - 没有尾部斜杠的基本 Uri

标签 c# .net url uri

如果我像这样使用 UriBuilder 创建一个 Uri:

var rootUrl = new UriBuilder("http", "example.com", 50000).Uri;

然后 rootUrlAbsoluteUri 总是包含一个尾部斜杠,如下所示:

http://example.com:50000/

我想要的是创建一个没有尾部斜线的 Uri 对象,但这似乎是不可能的。

我的解决方法是将它存储为字符串,然后做一些丑陋的事情:

var rootUrl = new UriBuilder("http", "example.com", 50000).Uri.ToString().TrimEnd('/');

我听说有人说没有尾部斜杠,Uri 是无效的。我认为那不是真的。我查看了 RFC 3986,在第 3.2.2 节中说:

If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character.

它并没有说结尾的斜杠必须在那里。

最佳答案

尾部斜杠在任意 URI 中不是必需的,但它是请求的绝对 URI 的规范表示的一部分 in HTTP :

Note that the absolute path cannot be empty; if none is present in the original URI, it MUST be given as "/" (the server root).

坚持the specUri 类以带有尾部斜杠的形式输出 URI:

In general, a URI that uses the generic syntax for authority with an empty path should be normalized to a path of "/".

此行为在 .NET 中的 Uri 对象上不可配置。 Web 浏览器和许多 HTTP 客户端在发送具有空路径的 URL 请求时执行相同的重写。

如果我们想在内部将我们的 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"

关于c# - 没有尾部斜杠的基本 Uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46968185/

相关文章:

c# - Linq/ Entity Framework 中的对象和上下文有什么区别

c# 执行 shell 命令并获取结果

c# - 不允许新事务,因为 session 中还有其他线程在运行 LINQ To Entity

javascript - Uncaught Error : Not an Array - google charts

c# - 你能得到 XslCompiledTransform 的进展吗?

java - 我的正则表达式检测字符串中的 url 时出现问题?

c# - 以编程方式选择 TabControl 中的现有 TabPage 显示空白页

c# - .NET:KeyValuePair<string, string> 的非泛型?

java - 在 Struts 2 中隐藏 struts.xml 值的参数

javascript - Google map 动态 URL 生成