结合两个相对的Uris

Law*_*ton 12 .net c# uri

我需要结合两个相对的Uris,例如../mypath/myimage.png创造../mypath/myimage.png.它们不是磁盘上文件的路径,因此Path.Combine不合适(它们是网页资源的相对路径).new Uri抛出一个ArgumentOutOfRangeException因为基础uri是相对的(不是绝对的).

除了检查尾部斜线然后自己组合路径之外,我还有其他选择吗?

编辑:

这是一个测试用例,它演示了当第一个url尚未包含尾部斜杠时Path.Combine不适用于这种情况:

// The first case fails with result "../testpath\resource.png"
[TestCase("../testpath", "resource.png", "../testpath/resource.png")] 
[TestCase("../testpath/", "resource.png", "../testpath/resource.png")]
public void TestPathCombine(string path, string resourceName, string expectedResult) {
    string result = Path.Combine(path, resourceName);
    Assert.AreEqual(expectedResult, result);
}
Run Code Online (Sandbox Code Playgroud)

Fré*_*ric 8

如果你的第二部分(就像在我自己​​的情况下)真的是一个没有任何转义的文件名(因此可能包含一个url的invalids字符),这里是我最终得到的解决方案:

VirtualPathUtility.Combine(
    VirtualPathUtility.AppendTrailingSlash(relativeUri), 
    Uri.EscapeDataString(fileName));
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案不支持完整的uri(带有方案,主机,端口):它将使用完整的uri抛出异常.感谢Manish Pansiniya 提到System.Web.VirtualPathUtility.

另外,由于我的文件名实际上是部分文件路径(某些文件夹名称后跟文件名),而不是直接调用System.Uri.EscapeDataString,我调用了以下函数:

/// <summary>
/// Convert a partial file path to a partial url path.
/// </summary>
/// <param name="partialFilePath">The partial file path.</param>
/// <returns>A partial url path.</returns>
public static string ConvertPartialFilePathToPartialUrlPath(
    string partialFilePath)
{
    if (partialFilePath == null)
        return null;
    return string.Join("/", 
        partialFilePath.Split('/', '\\')
            .Select(part => Uri.EscapeDataString(part)));
}
Run Code Online (Sandbox Code Playgroud)

(对于使用过的string.Join重载,需要使用System.Linq for .Select和fx4.)


Man*_*iya 1

不要使用 path.combine,因为它用于物理路径,因此它可能会让您对斜杠感到困惑。您可以制作自己的 Uri 组合函数。检查末尾的斜杠并将其附加到下一个斜杠。

带两个参数的 URI 构造函数有帮助吗?

new Uri(Uri baseUri, string relativeUri)
Run Code Online (Sandbox Code Playgroud)

  • 正如我在帖子中所述,使用新的 URI 构造函数会失败并出现“ArgumentOutOfRangeException”,因为 baseUri 是相对的。创建自己的函数似乎确实是我唯一的选择。 (8认同)