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

时间:2012-08-14 08:29:53

标签: c# .net 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));
    }

如果UriIsWellFormedUriString的绝对版本中识别Hashbangs,为什么不在相对版本中?我错过了什么?

注意:This无效。

1 个答案:

答案 0 :(得分:3)

这不符合你的预期是因为hashbang不是URI Scheme的一部分。该方法期望URI格式的分层部分和哈希标记(以及随后的哈希棒)不是确定相对和绝对路径的分层部分的成员。

< >是必需的部分
[]是可选部分

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

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

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

以下是您的更多信息。这些都来自描述Uri.IsWellFormedUriString()方法的MSDN

  

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

说明:

  

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

     

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

     

以下是一些失败的例子:

     

http://www.contoso.com/path???/file姓名
  该字符串未正确转义。

     

C:\目录\文件名
  字符串是绝对的Uri,表示隐式文件Uri。

     

文件:// C:/目录/文件名
  字符串是绝对URI,在路径之前缺少斜杠。

     

的http:\主机/路径/文件
  该字符串包含未转义的反斜杠,即使它们将被视为正斜杠

     

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