ASP.NET中的空格或%20

时间:2009-12-10 14:29:59

标签: asp.net asp.net-mvc

美好的一天,每个人。

我在ASP.NET引擎中发现奇怪的行为,当它处理不存在的空白URL时。

如果我们拥有this一般的常规网址:https://stackoverflow.com/questions/tagged 1 / c%23

我们按照开发人员的意图(如果有的话)获得正常的自定义404页面。

但这是错误。只需添加一些空格,例如thishttps://stackoverflow.com/questions/tagged / c%23

你会看到令人讨厌的ASP.NET 404错误页面。是否应该显示这样的页面是另一个故事。我已经做了一些沉重的谷歌搜索,进行调试研究,我可以说在这种情况下,所有自定义处理程序都被忽略,全局应用程序类(Application_Error中的global.asax)都没有到达。实际上,我没有看到 ASP.NET如何处理这种情况。有什么想法吗?

就像注意,这种行为与ASP.NET和ASP.NET MVC有关(如StackOverflow.com示例所示)。我尝试过其他网站,发现即使是Microsoft.com也属于此类别(请参阅thishttp://www.microsoft.com/en/us%20/default.aspx)。此外,我们可以用%20序列替换空格而没有更好的结果。

2 个答案:

答案 0 :(得分:2)

找到了解决方法。

HttpException抛出'错误执行pageName.aspx'消息的子请求。

首先,ASP.NET无法找到请求的页面或路由。然后从System.Web.CachedPathData.GetVirtualPathData抛出异常(实际上,来自System.Web.CachedPathData.GetConfigPathData,但GetVirtualPathData会使事情变得清晰。

然后,如果我们有任何错误处理程序,它会提供一些操作并尝试执行某些操作。在这里,我们通常会将Server.TransferRequest.Redirect移至用户页面404或更常见的错误页面。但。在当前情况下,无论如何都会抛出HttpException,我们得到ASP.NET错误页面。在这种情况下Server.ClearErrorServer.RewritePath可以提供帮助:异常不会以这种方式抛出。 但是!此类错误处理会导致我们的应用程序抛出正常的业务逻辑异常。

要解决新的麻烦,我们必须使用if / else取决于我们是否收到HttpException(因此我们使用带有ClearError的ServerRewrite)或者我们自己的代码中的一些异常。但是,如果你提供自己的异常类,那就好了,但如果不是......

无论如何,我认为这是一个非常奇怪的情况,特别是Application_Error处理程序被忽略,而其他应用程序代码仍在执行。

修改

由于代码方式不是最佳选择(我们只能猜测,当异常消息为空且InnerException为null时我们有此错误)更好的解决方案位于ISAPI重写器中,其规则为{{1}自定义404页面。在这里,我们会抓住所有请求,例如(\s+(\.aspx).*)|(\s+/)/somePage .aspx。当我们的空格不在.aspx或斜杠之前但在页面名称或路径部分之内时,我们没有提到问题。

答案 1 :(得分:0)

请问永远不会到达asp.net管道。如果在IIS中设置错误文档,是否会显示它们而不是“讨厌的页面”?