考虑以下程序(使用.NET 4.6.1测试):
var baseUri = new Uri(@"C:\test \", UriKind.Absolute);
var absolute = new Uri(@"C:\test \space .txt", UriKind.Absolute);
var relative = new Uri("space .txt", UriKind.Relative);
var combined = new Uri(baseUri, relative);
Uri extracted = baseUri.MakeRelativeUri(absolute);
var rebuilt = new Uri(baseUri, extracted);
Console.WriteLine(baseUri.LocalPath); // Outputs C:\test \
Console.WriteLine(absolute.LocalPath); // Outputs C:\test \space .txt
Console.WriteLine(combined.LocalPath); // Outputs C:\test \space .txt
Console.WriteLine(rebuilt.LocalPath); // Outputs C:\test \space%20.txt
我没想到最后一行的结果。这是一个错误还是正常的行为? (注意:从Mono 4.4.1执行程序会产生一致的结果 - 输出中没有%20。)
要获得我期望的结果,以下解决方法可行。但是,在我确定它是否是一个错误之前,我觉得使用它并不舒服,因为行为可能会改变。
var rebuilt = new Uri(baseUri, Uri.UnescapeDataString(extracted.ToString()));