【问题标题】:Create new URI from Base URI and Relative Path - slash makes a difference?从基本 URI 和相对路径创建新 URI - 斜杠有什么不同?
【发布时间】:2014-03-20 19:55:22
【问题描述】:

为什么在使用 new URI(baseUri, relativePath) 时,斜线会有所不同?

此构造函数通过组合 baseUri 和 relativeUri ..来创建一个 Uri 实例。

并且,如何将相对路径安全/一致地附加到 URI?

var badBase = new Uri("http://amee/noTrailingSlash");
var goodBase = new Uri("http://amee/trailingSlash/");
var f = "relPath";
new Uri(badBase, f)     // BAD  -> http://amee/relPath
new Uri(goodBase, f)    // GOOD -> http://amee/trailingSlash/relPath

即使初始 URI 没有尾部斜杠,所需的输出也是“好”的情况。

【问题讨论】:

    标签: c# .net uri trailing-slash


    【解决方案1】:

    为什么在使用新的 URI(baseUri, relativePath) 时斜线会有所不同?

    嗯,这就是网络上通常发生的事情。

    例如,假设我正在查看http://foo.com/some/file1.html,并且有一个指向file2.html 的链接——该链接指向http://foo.com/some/file2.html,对吗?不是http://foo.com/some/file1.html/file2.html

    更具体地说,这遵循RFC 3986 的第 5.2.3 节。

    5.2.3。合并路径

    上面的伪代码指的是一个“合并”例程,用于合并一个 具有基本 URI 路径的相对路径引用。这是 完成如下:

    • 如果基础 URI 具有已定义的权限组件和空 路径,然后返回一个由“/”连接的字符串 参考路径;否则,

    • 返回一个由引用的路径组件组成的字符串 附加到基本 URI 路径的最后一段以外的所有部分(即, 排除基本 URI 中最右边的“/”之后的任何字符 路径,或者排除整个基本 URI 路径(如果它不包含) 任何“/”字符)。

    【讨论】:

    • 我也刚刚找到了你的other answer。感谢您提供 RFC 链接,因为它明确回答了我的“为什么”问题。
    • @user2864740:感谢您添加适当的报价 :)
    • 如果不去URI->String->URI route,我认为没有备用URI(eitherOrSlash) -> URI(withSlash)
    • @user2864740:我不知道,恐怕:(
    【解决方案2】:

    我一直在使用带有重载new Uri(baseUri, relativePath) 的 Uri 构造函数。也许其他人可能会发现结果很有用。这是我编写的测试应用程序的输出:

    A) Base Address is domain only
    ==============================
    
    NO trailing slash on base address, NO leading slash on relative path:
    http://foo.com   +  relative1/relative2 :
        http://foo.com/relative1/relative2
    
    NO trailing slash on base address, relative path HAS leading slash:
    http://foo.com   +  /relative1/relative2 :
        http://foo.com/relative1/relative2
    
    Base address HAS trailing slash, NO leading slash on relative path:
    http://foo.com/   +  relative1/relative2 :
        http://foo.com/relative1/relative2
    
    Base address HAS trailing slash, relative path HAS leading slash:
    http://foo.com/   +  /relative1/relative2 :
        http://foo.com/relative1/relative2
    
    B) Base Address includes path
    =============================
    
    NO trailing slash on base address, NO leading slash on relative path:
    http://foo.com/base1/base2   +  relative1/relative2 :
        http://foo.com/base1/relative1/relative2 
        (removed base2 segment)
    
    NO trailing slash on base address, relative path HAS leading slash:
    http://foo.com/base1/base2   +  /relative1/relative2 :
        http://foo.com/relative1/relative2
        (removed base1 and base2 segments)
    
    Base address HAS trailing slash, NO leading slash on relative path:
    http://foo.com/base1/base2/   +  relative1/relative2 :
        http://foo.com/base1/base2/relative1/relative2
        (has all segments)
    
    Base address HAS trailing slash, relative path HAS leading slash:
    http://foo.com/base1/base2/   +  /relative1/relative2 :
        http://foo.com/relative1/relative2
        (removed base1 and base2 segments)
    

    【讨论】:

    • 我永远不会猜到new Uri() 的行为,其基地址有路径。这个答案为我节省了很多头发。
    【解决方案3】:

    我一直在寻找相同的解决方案,并得出以下解决方案:

    var badBase = new Uri("http://amee/noTrailingSlash");
    var goodBase = new Uri("http://amee/trailingSlash/");
    var f = "relPath";
    string badBaseUrl = Path.Combine(badBase,f);
    string goodBaseUrl = Path.Combine(goodBase,f);
    new Uri(badBaseUrl);  //----> (http://amee/trailingSlash/relPath)
    new Uri(goodBaseUrl); //---> (http://amee/trailingSlash/relPath)
    

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 2010-12-25
      • 2018-04-08
      • 2014-08-27
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多