【问题标题】:Path part gets overwritten when merging two URIs合并两个 URI 时路径部分被覆盖
【发布时间】:2010-12-20 05:39:45
【问题描述】:

我需要合并两个都包含 .Path 信息的 URL。

我想使用Uri 给我提供 .TryCreate() 的可能性,这样我就可以捕获格式错误的 URL。

我面临的问题是,当我合并绝对和相对 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 类来组合包含路径信息的 URL?

【问题讨论】:

    标签: c# api url uri


    【解决方案1】:

    您的相对 URI 应该是相对的,即删除第一个斜杠(或添加句点),

    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;
    

    【讨论】:

    • 你试过了吗?当我这样做时没有任何区别。
    • @anders,是的,对我有用;我用一个完整的例子编辑我的答案;请看一下
    • 啊,我发现是什么让你的代码工作而不是我的:似乎绝对网址也必须以 / 结尾才能使其工作!我使用字符串 absoluteUrl = "hostname/path";它没有用,但是在“路径”之后有两个结束斜线并且在“我的”之前没有开始斜线,它似乎有效!这看起来很不稳定,所以要多做一点测试,但你应该得到这个答案:-)
    【解决方案2】:

    使用Uri.TryCreate() 时最好同时检查baseUrirelativePath

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

    参考https://stackoverflow.com/a/58757870/5765982

    但是,基本 Uri 必须以 / 结尾,并且相对不能以 / 开头;否则它将删除基本 Url 的尾随部分

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2020-04-11
      • 1970-01-01
      • 2013-03-25
      • 2011-05-17
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多