因为您使用的是.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;
}
为您的应用程序选择合适的不太可能的令牌。