gpt4 book ai didi

c# - 为什么传递给 Uri.MakeRelativeUri 的 Uri 中的冒号 ":"会导致异常?

转载 作者:太空狗 更新时间:2023-10-29 21:37:03 24 4
gpt4 key购买 nike

下面这行代码给出了一个异常。这是框架中的错误吗?如果不能,我可以采用什么方法?

问题似乎是由“:”(冒号)引起的,但是我确实看到这样的 URI 在生产网站上正常工作(即在现实世界中似乎是有效的 URI)

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xx:yy"));
// gives => System.UriFormatException: A relative URI cannot be created because the
// 'uriString' parameter represents an absolute URI

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xxyy"));
// this works - removed the colon between the xx and yy

附言。鉴于上述情况,我可以具体问一下,我可以使用什么 .NET 类/方法(注意我正在解析来自网络的 HTML 页面)来获取 (a) 页面 URI 和 (b) 来自 HTML 的相关字符串HREF 参数 [例如在这种情况下应该是“/xx:yy”]并返回可用于寻址该资源的有效 URI?

换句话说,我如何模仿浏览器的行为,当您点击它时,浏览器会翻译 HREF 和页面 URI 以生成用于转到该资源的 URI。

最佳答案

我认为这是一个错误。

RFC1738 表示 :(以及其他字符)可能在方案中保留用于特殊含义。然而http方案并没有在路径部分保留它

Within the <path> and <searchpart> components, "/", ";", "?" are reserved.

(不是:。)

hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]

因此,http://test.com/xx:yy 是一个有效的 URI。较新的 RFC3968 同意:

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

但是,当然,相对于 http://test.com/asdf,生成的 xx:yy 将是一个绝对 URI 而不是有效的相对 URI:

path-noscheme = segment-nz-nc *( "/" segment )
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"

所以 MakeRelativeUri 报告问题是正确的,但实际上它应该通过编码 : 自动修复它在相对 URI 的第一段中有效的 %3A 的绝对 URI 中有效。

我通常会尽量避免使用 MakeRelativeUri 来支持根相对 URI,这样更容易提取并且没有这个问题(/xx:yy 是好的)。

关于c# - 为什么传递给 Uri.MakeRelativeUri 的 Uri 中的冒号 ":"会导致异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com