为什么我从VirtualPathUtility ToAbsolute获得一些具有某些路径的HttpException?

Aak*_*shM 4 c# asp.net httpexception .net-3.5 system.web

我正在尝试使用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");
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Aak*_*shM 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
    }));
  }
Run Code Online (Sandbox Code Playgroud)

哪些参考

private static char[] s_illegalVirtualPathChars = new char[4]
{
  ':',
  '?',
  '*',
  char.MinValue
};
Run Code Online (Sandbox Code Playgroud)

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

拆卸已经重写的4.0 System.Web节目VirtualPath.Create更加挑剔.

这个现已解散的blogs.msdn帖子的web.archive捕获显示了最早提到这个问题的一个.MS员工回复:

2006年2月26日星期日下午11:49 DmitryR Exception on ~/path?qs 是一个我需要修复的错误...

最简单的解决方法是ResolveAppRelativeLinkToUrl在调用周围 保存/恢复查询字符串 VirtualPathUtility.ToAbsolute.

解决方法是使用完全限定的UTL而不是"〜/ ...".

谢谢,

梅德

where 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;
}
Run Code Online (Sandbox Code Playgroud)

为您的应用选择一个不太适合的令牌.