代码之家  ›  专栏  ›  技术社区  ›  Anders Rask

合并两个URI时会覆盖路径部分

  •  6
  • Anders Rask  · 技术社区  · 15 年前

    我想用 Uri 使我能够创建.TryCreate(),以便捕获格式错误的URL。

    我面临的问题是基地 URI 合并绝对URI和相对URI时,路径似乎被忽略:

    Uri absoluteUri= new Uri("http://hostname/path/", UriKind.Absolute);
    Uri relativeUri = new Uri("/my subsite/my page.aspx?my=query", UriKind.Relative);
    Uri resultUri;
    if (!Uri.TryCreate(absoluteUri, relativeUri, out resultUri))
          // handle errors
    

    http://hostname/my%20subsite/my%20page.aspx?my=query
    

    http://hostname/path/my%20subsite/my%20page.aspx?my=query
    

    有没有一种方法可以使用 Uri

    1 回复  |  直到 13 年前
        1
  •  16
  •   Peter Mortensen icecrime    13 年前

    string relative = "/my subsite/my page.aspx?my=query";
    
    Uri test1= new Uri(relative.Substring(1), UriKind.Relative); // without 'root'
    Uri test2= new Uri("." + relative, UriKind.Relative);        // with 'current'
    

    工作示例:

    Uri baseUri = new Uri("http://hostname/path/");
    string relative = "/my subsite/my page.aspx?my=query";
    
    Uri test1 = new Uri(baseUri, relative);              // original string
    Uri test2 = new Uri(baseUri, relative.Substring(1)); // without 'root' character
    Uri test3 = new Uri(baseUri, "." + relative);        // with 'current' character
    
    Console.WriteLine(test1.OriginalString); // wrong
    Console.WriteLine(test2.OriginalString); // right!
    Console.WriteLine(test3.OriginalString); // right!
    

    因此,您可能应该像这样处理您的相关部分:

    if (relative.StartsWith("/"))
        relative = "." + relative;
    
        2
  •  0
  •   Xuewen Zhang    3 年前

    最好两个都检查一下 baseUri relativePath 使用时 Uri.TryCreate() :

    var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
    var relativeUri = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
    

    提到 https://stackoverflow.com/a/58757870/5765982

    / 而亲戚也不必从 ; 否则,它将删除基本Url的尾部