URL 中的 ASP.NET 空格或 %20

标签 asp.net asp.net-mvc

今天是个好日子。

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

当我们有像 this 这样的普通 URL 时一: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 序列替换空格,但没有更好的结果。

最佳答案

找到解决方法。
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(因此我们使用 ServerRewrite 和 ClearError)或我们自己的代码中的一些异常。但同样,如果您提供自己的异常类,那很好,但如果不...

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

编辑

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

关于URL 中的 ASP.NET 空格或 %20,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881350/

相关文章:

c# - 在 ASP.NET MVC 中使用路由映射到 ASMX 服务

c# - 使用 'inherits' 关键字时不允许使用 'model' 关键字

c# - ASP.NET 动态控件添加

c# - 将通用列表<string> 转换为 byte[ ]

asp.net-mvc - 如何使用 Moq 模拟存储库 Single(Expression<Func<TEntity, bool>> predicate) 方法

javascript - 如何防止排序时被折叠的jqgrid

asp.net-mvc - 如何让reactJS在IIS上运行

javascript - C# 中的 CustomValidator 未拾取颜色

asp.net - Azure .Net WebApp 部署失败,但可以在 VS 本地运行

C# 获取页面类型名称?