UriBuilder没有正确组合两个uris

时间:2015-02-28 00:01:53

标签: c# .net .net-4.5

所以这是我的问题: 我想组合一个URI和一个字符串。 URI是(父)文件夹的路径,而字符串表示子文件夹的路径(不要问我为什么这样做,两种类型都需要保持这种方式才能使其余的程序运行)

我的代码:

private Uri BuildUri(Uri basePath, string resource)
{
    var uriBuilder = new UriBuilder(basePath)
    {
        Path = resource,
    };
    return uriBuilder.Uri;
}

如果我将此代码称为basePath,例如“D:\ Test”和资源是“位置”,URI构建器将这两者合并到file:///位置,并完全忽略完整的基本路径。我可以补充一点,basePath始终是UriKing.Absolute

类型

我做错了什么?如果我这样做:

var completePath = Path.Combine(basePath.AbsolutePath, resource);
return new Uri(completePath);

它正确返回一个URI,但由于Path.Combine在Live环境中存在一些问题(即权限),我想使用UriBuilder(它似乎是为我想要它执行的任务而构建的)。 / p>

2 个答案:

答案 0 :(得分:2)

确保基URI以斜杠(或反斜杠)结尾,而相对URI则不是。这是他们正确组合的唯一方式。

答案 1 :(得分:2)

  

我做错了什么?

您正在组合构造函数和初始化语法,它完全覆盖.Path属性,而不是附加到它。

...基本上

var uriBuilder = new UriBuilder("D:\\Test");
// uriBuilder.Path is now "D:\\Test"
// ToString() will give "file:///D:/Test"

uriBuilder.Path = "locations";
// ToString() will give  "file://locations", because Path is "locations"

如果您不能使用Path.Combine,则必须编写自己的Path.Combine。

在我非常有限的测试中,如果你只是假设“/”是目录分隔符,那么UriBuilder似乎做对了。

var uriBuilder = new UriBuilder("D:\\Test");
uriBuilder.Path += "/locations";
// uriBuilder.ToString() == "file:///D:/Test/locations"

但是,如果basePath已经以“/”或“\”结尾,那么您的网址最终会出现双斜杠。从技术上讲,这仍然是一个有效的URL。但它很难看,有人可能会最终提出一个针对你的错误。您必须处理以“/”结尾的uriBuilder.Path的所有排列,以及以“/”,“\”开头的resource处理的所有排列。