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)
为您的应用选择一个不太适合的令牌.