我们在ASP.NET上有一个自定义REST处理程序,它配置如下,以处理所有传入的请求:
<add path="*" verb="*" type="REST.RESTProtocolHandler"/>
但是,传递一个正确编码或根本不编码的管道字符会触发一个似乎来自ASP.NET内部的验证错误。
访问http://localhost:8080/%7c
或http://localhost:8080/|
会产生此错误:
[ArgumentException:路径中的非法字符。] System.IO.Path.CheckInvalidPathChars(String path)+7489125 System.IO.Path.Combine(String path1,String path2)+40 System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path,VirtualDirectoryMapping mapping)+114 System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID,VirtualPath path,String&amp; directory,String&amp; baseName)+72 System.Web.Configuration.UserMapPath.MapPath(String siteID,VirtualPath path)+30 System.Web.Configuration.UserMapPath.MapPath(String siteID,String path)+31 System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath,Boolean permitNull)+297 System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath,Boolean permitNull)+51 System.Web.CachedPathData.GetConfigPathData(String configPath)+341 System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath,Boolean permitPathsOutsideApp)+110 System.Web.HttpContext.GetFilePathData()+36 System.Web.HttpContext.GetConfigurationPathData()+26 System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context)+43 System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context,Boolean canThrow)+41 System.Web.HttpResponse.ReportRuntimeError(Exception e,Boolean canThrow,Boolean localExecute)+101 System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr,HttpContext context,Exception e)+383
没有用户区代码被执行。这是一个配置选项吗?转载于IIS 7&amp; VS Studio的2008年开发服务器。
Stack Overflow似乎处理此错误确定,它看起来像为 https://stackoverflow.com/%7c呈现动态生成的404 MVC页面。
有什么想法吗?
答案 0 :(得分:1)
尝试拦截Global.asax文件中的异常。在那里实现(Global.asax.cs)这个方法:
protected void Application_Error(Object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
//do whatever you want with that exception
//or get the url from the context, reformat and redirect
}
答案 1 :(得分:1)
首先你需要修补一下 登记处:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;826437
重新启动IIS
并且它有效。
但是我已经使用IIS7完成了这项工作而没有任何问题,但是在IIS6中我收到了这个错误(路径中的字符非法)。
答案 2 :(得分:0)
我有一个类似的程序拦截所有并用管道尝试它给我同样的错误。我认为它与IIS进行路径测试(mappath)之前有关,它知道谁来处理请求。 你的处理程序采用root(意味着所有调用)但我假设IIS的方式是通用的。
因此,我假设您在文件系统上无法使用的任何或大多数路径字符都将在IIS请求(GET / POST)上失败。
也许有人知道如何禁用IIS检查。根据错误,它似乎甚至在你的web.config被读取之前发生,因为它试图找到正确的配置?,
也许可以使用您自己的错误页面作为重定向回到您的处理程序?
答案 3 :(得分:0)
我认为答案就在你的堆栈跟踪中。在System.IO.Path.CheckInvalidPathChars()调用上抛出错误 - 这不是检查Url,而是检查IIS所在的Windows文件系统。管道角色是Url非法,但基本上是DOS非法。
如果在IIS尝试在服务器上找到匹配路径之前截取Url,我希望您可以处理此错误。这可能在于有一个重写规则或类似的内容,用于查找和重写包含不需要的字符的Url。
答案 4 :(得分:-1)
默认情况下,IIS不允许URL中的某些字符并将其视为非法。这是问题的来源 - 它甚至不会调用您拥有的处理程序。据我所知,除了Windows注册表之外,没有地方可以配置通过UI接受哪些字符。我不知道你为什么要使用烟斗,但我不认为这是好习惯。对于任何异常的错误页面 - you can always have your own error page,以便用户看不到丑陋的消息。