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

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

这是怎么回事?

因为您使用的是.NET 3.5,所以您使用的是2.0 System.Web程序集,它有哪些缺陷? 通过这种方法被认为是非法的路径角色。 这在特定于版本的MSDN页面的社区评论中提到。

通过反汇编,可以看出调用最终在( internalVirtualPath.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已被重写为更具辨别力。

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

2006年2月26日星期日下午11:49 DmitryR〜 ~/path?qs上的exception是我需要修复的错误…

最简单的解决方法是在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; } 

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