Asp.net路径压缩
时间:2020-03-05 18:50:47 来源:igfitidea点击:
我有一个asp.net网址路径,该网址正在以Web形式生成,并出现类似" /foo/bar/../bar/path.aspx"的内容,并且也出现在生成的HTML中。它应该缩短为" /foo/bar/path.aspx"。
Path.Combine没有修复它。是否有清除此路径的功能?
解决方案
回答
我们可以创建一个将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));
这有点古怪,但是可以为我们提供的特定示例工作。
编辑:更新以反映安德鲁的评论。
回答
Sarcastic的回复比我的要好得多,但是如果我们使用的是文件系统路径,那么下面的我的丑陋技巧也可能会很有用。 (翻译:我打过,所以如果我不张贴的话,我会被该死的:)
Path.Combine只是将两个弦拍在一起,注意前导或者尾随的斜杠。据我所知,唯一进行标准化的Path方法是Path.GetFullPath。以下内容将为我们提供"清理"版本。
myPath = System.IO.Path.GetFullPath(myPath);
当然,存在一个小问题,即生成的路径将被植根并且正斜杠将转换为反斜杠(例如" C:\ foo \ bar \ path.aspx")。但是,如果我们知道原始路径的父根,则剥离根应该不是什么大问题。
回答
无论我们做什么,都不要使用静态UriBuilder。这就引入了各种潜在的竞争条件,直到我们承受重负荷,我们才可能检测到这些条件。
如果两个不同的线程同时调用UriHelper.NormalizeRelativePath,则一个线程的返回值可以任意传递回另一个调用者。
如果要使用UriBuilder进行此操作,只需在需要时创建一个新文件即可(创建起来并不昂贵)。