新的 Uri 解码相对路径

Posted

技术标签:

【中文标题】新的 Uri 解码相对路径【英文标题】:new Uri decoding relative path 【发布时间】:2016-03-07 08:10:21 【问题描述】:

以下代码...

string date = DateTime.UtcNow.ToString("o");
Console.WriteLine(date);
string encodedDate = WebUtility.UrlEncode(date);
Console.WriteLine(encodedDate);
Uri uri = new Uri("https://mywebsite/");
Console.WriteLine(uri.ToString());
string relativePath = $"/mM0jpk613J5lzY00c3EaxQ%3D%3D/encodedDate";
Console.WriteLine(relativePath);
uri = new Uri(uri, relativePath);
Console.WriteLine(uri.ToString());

产生以下输出是:-

2016-03-07T08:17:38.5247330Z
2016-03-07T08%3A17%3A38.5247330Z
https://mywebsite/
/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08%3A17%3A38.5247330Z
https://mywebsite/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08:17:38.5247330Z

我期待最后一行是

https://mywebsite/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08%3A17%3A38.5247330Z

为什么 Uri 不转义相对路径?一种解决方法似乎是将相对路径编码两次,但为什么呢?

我应该使用其他方法来创建此网址吗?

编辑:我更新了代码以显示更奇怪的行为,相对 uri 的第一部分保持编码,但第二部分没有!

【问题讨论】:

我已将其记录为 microsoft connect 的错误...connect.microsoft.com/VisualStudio/feedback/details/2444172 让我们计算一下这是否是一个错误。每天有多少开发者使用 Uri 类?很多我觉得! Uri 自 1.1 - 2003 版以来一直在 .net 中?我想他们现在应该已经注意到了…… @Gusdor 我很清楚 Uri 在框架中的使用时间。我会说从第一个 beta 2001(我使用的)开始。如果您运行代码的行为不一致,那么对于它解码相对路径的一半并留下另一半编码的可能的逻辑解释是什么? 有人想知道我的工作是使用文件时间而不是不需要编码和解码 【参考方案1】:

URI 是一个对象,它将以其干净/未转义的形式表示链接。如果您正在寻找以添加方式检索它,请使用以下属性。

uri.OriginalString

【讨论】:

是的,我仍然不理解逻辑,未转义的 URI 有什么用?我认为您的回答在我编辑之前似乎更容易接受。这对我来说似乎是一个错误。你同意吗? 不是真正的错误,但同意提供 uri.EscapedString 属性会很有用。 你如何解释relativePath字符串的一部分被解码而另一部分不被解码? 编辑后,是的,很明显,任何“清理”尝试都只应用于相对 URL 的最后一部分。看起来很奇怪,一定是个bug。 @Mick 添加时字符串未转义。这样 api 就可以确保所有字符串的一致性。开发人员不太可能转义源代码中的 uri 字符串,而不仅仅是使用纯文本。事实上,我认为这样做很疯狂。此方法将转义最终的 uri 字符串 msdn.microsoft.com/en-us/library/… uri 编码是协议问题,由使用 URI 的 API 单独处理。

以上是关于新的 Uri 解码相对路径的主要内容,如果未能解决你的问题,请参考以下文章

网络路径参考 URI / 方案相对 URL

绝对 URI 中的相对路径:java.net.URI.checkPath(URI.java:1823)

当相对 URI 包含空路径时,Java 的 URI.resolve 是不是与 RFC 3986 不兼容?

为啥使用 DataFrame 时 Spark 会报告“java.net.URISyntaxException:绝对 URI 中的相对路径”?

失败:IllegalArgumentException java.net.URISyntaxException:绝对 URI 中的相对路径:

Apache VFS 错误。因为它是相对路径,并且没有提供基本 URI