Asp.net路径压缩

时间:2008-09-10 14:38:34

标签: c# asp.net path

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

Path.Combine没有解决它。是否有清理此路径的功能?

3 个答案:

答案 0 :(得分: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但它​​适用于你给出的具体例子。

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

答案 1 :(得分:1)

无论你做什么,都不要使用静态UriBuilder。这会引入各种潜在的竞争条件,在重负荷之前,您可能无法检测到这些条件。

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

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

答案 2 :(得分:0)

Sarcastic的回复比我的好得多,但是如果你正在使用文件系统路径,那么丑陋的黑客攻击可能会变得有用。 (翻译:我输入了它,所以如果我不发布它,我会被诅咒:)

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

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

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