美好的一天,每个人。
我在ASP.NET引擎中发现奇怪的行为,当它处理不存在的空白URL时。
如果我们拥有this一般的常规网址:https://stackoverflow.com/questions/tagged 1 / c%23
我们按照开发人员的意图(如果有的话)获得正常的自定义404页面。
但这是错误。只需添加一些空格,例如this:https://stackoverflow.com/questions/tagged / c%23
你会看到令人讨厌的ASP.NET 404错误页面。是否应该显示这样的页面是另一个故事。我已经做了一些沉重的谷歌搜索,进行调试研究,我可以说在这种情况下,所有自定义处理程序都被忽略,全局应用程序类(Application_Error
中的global.asax
)都没有到达。实际上,我没有看到 ASP.NET如何处理这种情况。有什么想法吗?
就像注意,这种行为与ASP.NET和ASP.NET MVC有关(如StackOverflow.com示例所示)。我尝试过其他网站,发现即使是Microsoft.com也属于此类别(请参阅this:http://www.microsoft.com/en/us%20/default.aspx)。此外,我们可以用%20序列替换空格而没有更好的结果。
答案 0 :(得分:2)
找到了解决方法。
HttpException
抛出'错误执行pageName.aspx'消息的子请求。
首先,ASP.NET无法找到请求的页面或路由。然后从System.Web.CachedPathData.GetVirtualPathData
抛出异常(实际上,来自System.Web.CachedPathData.GetConfigPathData
,但GetVirtualPathData
会使事情变得清晰。
然后,如果我们有任何错误处理程序,它会提供一些操作并尝试执行某些操作。在这里,我们通常会将Server.Transfer
或Request.Redirect
移至用户页面404或更常见的错误页面。但。在当前情况下,无论如何都会抛出HttpException,我们得到ASP.NET错误页面。在这种情况下Server.ClearError
和Server.RewritePath
可以提供帮助:异常不会以这种方式抛出。 但是!此类错误处理会导致我们的应用程序抛出正常的业务逻辑异常。
要解决新的麻烦,我们必须使用if / else取决于我们是否收到HttpException(因此我们使用带有ClearError的ServerRewrite)或者我们自己的代码中的一些异常。但是,如果你提供自己的异常类,那就好了,但如果不是......
无论如何,我认为这是一个非常奇怪的情况,特别是Application_Error
处理程序被忽略,而其他应用程序代码仍在执行。
修改强>
由于代码方式不是最佳选择(我们只能猜测,当异常消息为空且InnerException为null
时我们有此错误)更好的解决方案位于ISAPI重写器中,其规则为{{1}自定义404页面。在这里,我们会抓住所有请求,例如(\s+(\.aspx).*)|(\s+/)
和/somePage .aspx
。当我们的空格不在.aspx或斜杠之前但在页面名称或路径部分之内时,我们没有提到问题。
答案 1 :(得分:0)
请问永远不会到达asp.net管道。如果在IIS中设置错误文档,是否会显示它们而不是“讨厌的页面”?