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));
    

如果UriIsWellFormedUriString 的绝对版本中识别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 兼容性的主要内容,如果未能解决你的问题,请参考以下文章

NET问答: 如何检查一个 string 是否为有效的 url 格式?