C# Asp.net路径压缩

C# Asp.net路径压缩,c#,asp.net,path,C#,Asp.net,Path,我有一个asp.net url路径,它是在web表单中生成的,它的输出类似于“/foo/bar/./bar/path.aspx”,并且在生成的html中也是这样。它应该缩短为“/foo/bar/path.aspx” 路径。联合收割机没有修复它。是否有清理此路径的功能 您可以创建一个helper类,该类将UriBuilder类包装在System.Net中 public static class UriHelper { public static string Normaliz

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


路径。联合收割机没有修复它。是否有清理此路径的功能

您可以创建一个helper类,该类将UriBuilder类包装在System.Net中

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));
这有点老套,但对于您给出的具体示例来说是可行的


编辑:更新以反映Andrew的评论。Sarcastic的回复比我的要好得多,但如果您使用的是文件系统路径,我下面的难看的hack可能也很有用。(翻译:我打字了,所以如果我不发,我会被诅咒:)

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


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

无论您做什么,都不要使用静态构建器。这引入了各种潜在的竞争条件,在你处于重负载状态之前,你可能无法检测到这些条件

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


如果您想使用UriBuilder来实现这一点,只需在需要时创建一个新的(创建它并不昂贵)

@Andrew关于静态UrlBuilder实例的观点非常好。我将向多丝之神祈祷宽恕。
myPath = System.IO.Path.GetFullPath(myPath);