我有一个asp.net url路径,它是在网络表单中生成的,并且会出现类似“/foo/bar/../bar/path.aspx”的内容,并且会在生成的html中出现也是这样。它应该缩写为“/foo/bar/path.aspx”。
Path.Combine没有解决它。是否有清理此路径的功能?
答案 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”)。但是如果你知道原始路径的父根,那么剥离根应该不是一个大问题。