Uri.IsWellFormedUriString用于相对Hashbang urls兼容性

sel*_*ary 8 .net c# ajax uri hashbang

在以下测试中,为什么(仅)最后一个失败?

    [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));
    }
Run Code Online (Sandbox Code Playgroud)

如果在Absolute版本中Uri识别出HashbangsIsWellFormedUriString,为什么不在Relative版本中呢?我错过了什么?

注意:没有用.

van*_*ane 3

这不能按您的预期工作的原因是 hashbang 不是URI Scheme的一部分。该方法期望 URI 格式的分层部分,并且散列标记(以及随后的散列符号)不是从中确定相对和绝对路径的分层部分的成员。

< > 为必填部分
[ ] 为可选部分

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

作为绝对 URI 的示例;如果我没记错的话,查询将被忽略,其中包括片段和哈希标记

http://domain.com/path/to/something/?query=1#fragment

这里还为您提供了一些更多信息。这全部来自 MSDN 描述该Uri.IsWellFormedUriString()方法

通过尝试使用字符串构造 URI 来指示字符串是否格式良好,并确保字符串不需要进一步转义。

评论:

默认情况下,根据RFC 2396RFC 2732 ,该字符串被视为格式良好。如果启用国际资源标识符 (IRI) 或国际化域名 (IDN) 解析,则根据RFC 3986RFC 3987 ,该字符串将被视为格式良好。

如果出现以下任一情况,则认为该字符串格式不正确,导致该方法返回 false

以下是一些失败示例:

http://www.contoso.com/path???/文件名
字符串未正确转义。

c:\directory\filename
该字符串是一个绝对 Uri,表示隐式文件 Uri。

file://c:/directory/filename
该字符串是绝对 URI,路径前缺少斜杠。

http:\host/path/file
该字符串包含未转义的反斜杠,即使它们将被视为正斜杠

www.contoso.com/path/file
该字符串表示分层绝对 Uri,不包含“://”