2

我有一个 asp.net url 路径,它是在 web 表单中生成的,并且会出现类似“/foo/bar/../bar/path.aspx”的内容,并且也会像这样在生成的 html 中出现. 它应该缩短为“/foo/bar/path.aspx”。

Path.Combine 没有修复它。有清理这条路径的功能吗?

4

3 回答 3

4

您可以创建一个助手类,它在 System.Net 中包装了 UriBuilder 类

public static class UriHelper
{       
    public static string NormalizeRelativePath(string path)
    {
        UriBuilder _builder = new UriBuilder("http://localhost");
        builder.Path = path;
        return builder.Uri.AbsolutePath;
    }
}

然后可以这样使用:

string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));

这有点hacky,但它适用于您给出的具体示例。

编辑:更新以反映安德鲁的评论。

于 2008-09-10T14:52:42.983 回答
1

无论您做什么,都不要使用静态 UriBuilder。这引入了各种潜在的竞争条件,直到您处于重负载下才能检测到。

如果两个不同的线程同时调用 UriHelper.NormalizeRelativePath,则一个线程的返回值可以任意传回另一个调用者。

如果您想使用 UriBuilder 来执行此操作,只需在需要时创建一个新的(创建成本不高)。

于 2008-09-10T15:01:22.167 回答
0

Sarcastic 的回复比我的要好得多,但是如果您使用的是文件系统路径,那么我在下面的丑陋的 hack可能也很有用。(翻译:我打的,不贴我就完蛋了:)

Path.Combine 只是将两个字符串拼接在一起,注意前导或尾随斜杠。据我所知,唯一进行标准化的 Path 方法是 Path.GetFullPath。以下将为您提供“清理”版本。

myPath = System.IO.Path.GetFullPath(myPath);

当然,有一个小问题是生成的路径将被植根并且正斜杠将被转换为反斜杠(如“C:\foo\bar\path.aspx”)。但是如果您知道原始路径的父根,那么剥离根应该不是什么大问题。

于 2008-09-10T14:59:24.277 回答