C# 为什么我要从VirtualPath实用性得到一个HttpException来解决某些路径?
我正在尝试使用将应用程序相对路径(如C# 为什么我要从VirtualPath实用性得到一个HttpException来解决某些路径?,c#,asp.net,.net-3.5,system.web,httpexception,C#,Asp.net,.net 3.5,System.web,Httpexception,我正在尝试使用将应用程序相对路径(如~/MyPage.aspx)解析为应用程序绝对路径(如/MySite/MyApp/MyPage.aspx)。但是,对于某些路径,我收到一个HttpException,表示我的路径“不是有效的虚拟路径”。示例: // This works: var abs1 = VirtualPathUtility.ToAbsolute("~/MyPage.aspx#anchor"); // This errors: var abs2 = VirtualPathUtility
~/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
系统.Web
程序集,它的缺陷是?
被此方法视为非法路径字符。社区评论中提到了这一点
通过反汇编,可以看到调用以(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
已被重写,以便更具识别力
显示了最早提到的这个问题之一。MS员工回答:
2006年2月26日星期日晚上11:49,DmitryR在~/path?qs
是一个我需要修复的错误
最简单的修复方法是在中保存/恢复查询字符串
ResolveAppRelativeLinkToUrl
关于调用
虚拟实用性。解决方案
解决方法是使用完全限定的UTL,而不是“~/…”
谢谢
德米特里
其中,ResolveAppRelativeLinkToUrl
指报告者代码的方法名称
另一种解决方法是在调用VirtualPath实用性之前,使用安全令牌替换?
。要解决,请在调用后撤消替换:
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;
}
为你的申请选择一个不太可能的代币。@GrantThomas我真的不知道你是不是在开玩笑;如果你不是,我建议你