8

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

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

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

注意:没有帮助。

4

1 回答 1

3

这不能像您期望的那样工作的原因是 hashbang 不是URI Scheme的一部分。该方法期望 URI 格式的分层部分,并且哈希标记(以及随后的 hashbang)不是确定相对和绝对路径的分层部分的成员。

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

<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???/file name
该字符串未正确转义。

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

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

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

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

于 2012-09-01T00:38:24.693 回答