gpt4 book ai didi

c# - 为什么我从带有某些路径的 VirtualPathUtility ToAbsolute 获得 HttpException?

转载 作者:太空狗 更新时间:2023-10-30 00:20:12 28 4
gpt4 key购买 nike

我正在尝试使用 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 程序集,它有 ? 的缺陷此方法将其视为非法路径字符。 version-specific MSDN page 的社区评论中提到了这一点.

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

This web.archive capture of a now-defunct blogs.msdn post显示了最早提到这个问题的人之一。微软员工回应:

Sunday, February 26, 2006 11:49 PM by DmitryR Exception on ~/path?qs is a bug that I'll need to fix...

The easiest fix is to save/restore query string in ResolveAppRelativeLinkToUrl around the call to VirtualPathUtility.ToAbsolute.

A workaround is to use fully qualified UTLs instead of "~/...".

Thanks,

Dmitry

其中ResolveAppRelativeLinkToUrl指的是报告者代码的方法名。

另一种解决方法是在调用 VirtualPathUtility.ToAbsolute 之前将 ? 替换为安全 token ,然后撤消替换:

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;
}

为您的应用程序选择不太可能的 token 。

关于c# - 为什么我从带有某些路径的 VirtualPathUtility ToAbsolute 获得 HttpException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com