为什么我从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页面的社区评论中提到。
通过反汇编,可以看出调用最终在( 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
已被重写为更具辨别力。
这个现已解散的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; }
为您的应用选择一个不太适合的令牌。
上述就是C#学习教程:为什么我从VirtualPathUtility ToAbsolute获得一些具有某些路径的HttpException?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987146.html