Uri.IsWellFormedUriString 用于相对 Hashbang url 兼容性
Posted
技术标签:
【中文标题】Uri.IsWellFormedUriString 用于相对 Hashbang url 兼容性【英文标题】:Uri.IsWellFormedUriString for relative Hashbang urls compatibility 【发布时间】:2012-08-10 12:31:15 【问题描述】:在以下测试中,为什么(仅)最后一个测试失败?
[Fact]
public void IsWellFormedUriString_AbsolutNonHashTagUri_ReturnsTrue()
Assert.True(Uri.IsWellFormedUriString("http://www.RegularSite.org/Home", UriKind.Absolute));
[Fact]
public void IsWellFormedUriString_RelativeNonHashTagUri_ReturnsTrue()
Assert.True(Uri.IsWellFormedUriString("Home", UriKind.Relative));
[Fact]
public void IsWellFormedUriString_AbsolutHashTagUri_ReturnsTrue()
Assert.True(Uri.IsWellFormedUriString("http://www.w3.org/#!Home", UriKind.Absolute));
[Fact]
public void IsWellFormedUriString_RelativeHashTagUri_ReturnsTrue()
// Fails!
Assert.True(Uri.IsWellFormedUriString("#!Home", UriKind.Relative));
如果Uri
在IsWellFormedUriString
的绝对版本中识别Hashbangs,为什么不能在相对版本中识别?我错过了什么?
注意:This 没有帮助。
【问题讨论】:
【参考方案1】:这不能像您期望的那样工作的原因是因为 hashbang 不是URI Scheme 的一部分。该方法期望 URI 格式的分层部分,并且哈希标记(以及随后的 hashbang)不是确定相对和绝对路径的分层部分的成员。
是必填部分 [ ] 是可选部分
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
作为一个绝对URI的例子;如果我没记错的话,查询会被忽略,其中包括片段和哈希标记
http://domain.com/path/to/something/?query=1#fragment
这里也为您提供了更多信息。这都是来自MSDN描述Uri.IsWellFormedUriString()
方法
通过尝试用 字符串并确保字符串不需要进一步转义。
备注:
默认情况下,根据RFC 2396 和RFC 2732,字符串被认为是格式正确的。如果启用了国际资源标识符 (IRI) 或国际化域名 (IDN) 解析,则认为该字符串符合 RFC 3986 和 RFC 3987 的格式正确。
如果出现以下任一情况,则认为字符串格式不正确,导致方法返回false
以下是一些失败的例子:
http://www.contoso.com/path???/file姓名 字符串未正确转义。
c:\目录\文件名 该字符串是一个绝对Uri,代表一个隐式文件Uri。
文件://c:/目录/文件名 该字符串是一个绝对 URI,路径前缺少斜杠。
http:\主机/路径/文件 字符串包含未转义的反斜杠,即使它们将被视为正斜杠
www.contoso.com/path/file 字符串代表一个分层的绝对Uri,不包含“://”
【讨论】:
感谢您的详细回答,但根据它 - 第三次测试应该失败了,但事实并非如此。这没有回答我的问题。 @seldary 不,第三次测试会通过,因为你有http://www.w3.org/
作为绝对 Uri 这足以让它通过,因为它检测到 #
作为片段的开始,!Home
作为片段文本,因此它通过了。以上是关于Uri.IsWellFormedUriString 用于相对 Hashbang url 兼容性的主要内容,如果未能解决你的问题,请参考以下文章