4

我正在尝试使用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");

这是怎么回事?

4

1 回答 1

10

因为您使用的是 .NET 3.5,所以您使用的是程序集,该程序集存在被此方法视为非法路径字符2.0 System.Web的缺陷。这在特定于版本的 MSDN 页面?上的社区评论中有所提及。

通过反汇编可以看出,调用以 ( 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.0 System.Web节目的拆卸更加挑剔。VirtualPath.Create

这个 web.archive 捕获的一篇现已失效的 blogs.msdn 帖子显示了最早提到这个问题的地方之一。MS 员工回应:

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

最简单的解决方法是 ResolveAppRelativeLinkToUrl在调用 VirtualPathUtility.ToAbsolute.

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

谢谢,

德米特里

whereResolveAppRelativeLinkToUrl指的是报告者代码的方法名称。

另一种解决方法是?在调用 之前用安全令牌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;
}

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

于 2012-11-13T12:03:18.137 回答