【问题标题】:Uri.IsWellFormedUriString for relative Hashbang urls compatibilityUri.IsWellFormedUriString 用于相对 Hashbang url 兼容性
【发布时间】: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 没有帮助。

【问题讨论】:

    标签: c# .net ajax uri hashbang


    【解决方案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 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,不包含“://”

    【讨论】:

    • 感谢您的详细回答,但根据它 - 第三次测试应该失败了,但事实并非如此。这没有回答我的问题。
    • @seldary 不,第三次测试会通过,因为你有 http://www.w3.org/ 作为绝对 Uri 这足以让它通过,因为它检测到 # 作为片段的开始,!Home 作为片段文本,因此它通过了。
    猜你喜欢
    • 2013-03-15
    • 2018-08-06
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多