代码之家  ›  专栏  ›  技术社区  ›  Anthony Waqas Raja

ASP.NET路径压缩

  •  2
  • Anthony Waqas Raja  · 技术社区  · 16 年前

    我有一个ASP.NET URL路径,它是在一个Web表单中生成的,它的输出类似于“/foo/bar/../bar/path.aspx”,并且也是在生成的HTML中输出的,就像这样。它应该缩短为“/foo/bar/path.aspx”。

    路径。Combine没有修复它。是否有清除此路径的功能?

    3 回复  |  直到 13 年前
        1
  •  4
  •   Compile This    16 年前

    可以创建一个助手类,该类将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));
    

    它有点老土,但对于您给出的具体示例来说,它是有效的。

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

        2
  •  1
  •   Andrew    16 年前

    无论你做什么,都不要使用静态的uribuilder。这将引入各种可能的竞态条件,直到您承受重负时才可能检测到这些条件。

    如果同时有两个名为urihelper.normalizerelativepath的不同线程,则一个线程的返回值可以任意地传递回另一个调用方。

    如果您想使用UriBuilder来完成这项工作,只需在需要时创建一个新的(创建起来并不昂贵)。

        3
  •  0
  •   Ishmaeel    16 年前

    讽刺的回答比我的好得多,但是如果您使用的是文件系统路径,我的 下面丑陋的黑客 可能也有用。(翻译:我把它打出来了,如果我不把它寄出去,我就该死了。)

    把两个字符串组合在一起,注意前后斜杠。据我所知,唯一进行规范化的路径方法是path.getfullpath。下面将为您提供“已清理”版本。

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

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