【问题标题】:Why do I get an HttpException from VirtualPathUtility ToAbsolute with some paths?为什么我会从 VirtualPathUtility ToAbsolute 获得带有某些路径的 HttpException?
【发布时间】:2012-11-13 12:03:18
【问题描述】:

我正在尝试使用VirtualPathUtility.ToAbsolute 将应用程序相对路径(例如~/MyPage.aspx)解析为应用程序绝对路径(例如/MySite/MyApp/MyPage.aspx)。但是,对于某些路径,我收到 HttpException 说我的路径“不是有效的虚拟路径”。例子:

// This works:
var abs1 = VirtualPathUtility.ToAbsolute("~/MyPage.aspx#anchor");

// This errors:
var abs2 = VirtualPathUtility.ToAbsolute("~/MyPage.aspx?key=value");

发生了什么事?

【问题讨论】:

    标签: c# asp.net .net-3.5 system.web httpexception


    【解决方案1】:

    因为您使用的是.NET 3.5,所以您使用的是2.0System.Web 程序集,该程序集存在? 被此方法视为非法路径字符的缺陷。这在version-specific MSDN page的社区cmets中有所提及。

    通过反汇编可以看到调用结束在(internal)VirtualPath.Create,其中有:

      else if (VirtualPath.ContainsIllegalVirtualPathChars(virtualPath))
      {
        throw new HttpException(System.Web.SR.GetString("Invalid_vpath", new object[1]
        {
          (object) virtualPath
        }));
      }
    

    引用了哪些

    private static char[] s_illegalVirtualPathChars = new char[4]
    {
      ':',
      '?',
      '*',
      char.MinValue
    };
    

    其中一些可以合理地被视为路径的坏字符,但 ? 不应该被如此拒绝。

    4.0System.Web 的反汇编表明 VirtualPath.Create 已被重写为更具辨识度。

    This web.archive capture of a now-defunct blogs.msdn post 是最早提到这个问题的地方之一。 MS 员工回应:

    2006 年 2 月 26 日星期日晚上 11:49,作者:DmitryR 异常~/path?qs 是我需要修复的错误...

    最简单的解决方法是将查询字符串保存/恢复到 ResolveAppRelativeLinkToUrl 左右来电 VirtualPathUtility.ToAbsolute.

    一种解决方法是使用完全限定的 UTL,而不是“~/...”。

    谢谢,

    德米特里

    其中ResolveAppRelativeLinkToUrl 指的是报告者代码的方法名称。

    另一种解决方法是在调用VirtualPathUtility.ToAbsolute 之前将? 替换为安全令牌,然后再撤消替换:

    public static string SafeToAbsolute(string path)
    {
        var madeSafe = path.Replace("?", "UNLIKELY_TOKEN");
        var absolute = VirtualPathUtility.ToAbsolute(madeSafe);
        var restored = absolute.Replace("UNLIKELY_TOKEN", "?");
        return restored;
    }
    

    为您的应用程序选择合适的不太可能的令牌。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多