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进行此操作,只需在需要时创建一个新文件即可(创建起来并不昂贵)。