Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我要从VirtualPath实用性得到一个HttpException来解决某些路径?_C#_Asp.net_.net 3.5_System.web_Httpexception - Fatal编程技术网

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我真的不知道你是不是在开玩笑;如果你不是,我建议你