【问题标题】:asp.net mvc handle http 400 errorasp.net mvc 处理 http 400 错误
【发布时间】:2013-02-24 11:51:54
【问题描述】:

我有一个 ASP.NET MVC 4 应用程序,我想将所有 HTTP 400 错误重定向到我的自定义错误页面。尽管 HTTP 400 错误没有像 404 错误那样处理,但我搜索了一个小时以找到解决方案。有许多解决方案展示了如何转义 400(错误请求错误),即允许在 url 中使用特殊字符。但我无法找到一些解决方案来捕获异常。

请帮助我以某种方式捕获所有 HTTP 错误请求并将它们重定向到我的错误页面。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing http-status-code-400


【解决方案1】:

您可以做一些简单的事情,例如将其添加到您的 web.config 中

 <customErrors mode="RemoteOnly">
  <error statusCode="400" redirect="errorpage.html"/>
</customErrors>

【讨论】:

  • 我做了类似的事情,但 Http 400 错误也被重定向到为 http 404 错误定义的路由。我不明白为什么。
  • 会用 [HandleError] 装饰控制器动作来做你需要做的事情吗?
【解决方案2】:

在出现错误时切勿重定向用户,而是为失败的请求返回响应正文。我认为 IIS(和 ASP.NET)重定向到错误页面的功能从根本上是错误的、不正确的,并且违反了 HTTP 规范(因为错误是为错误页面资源本身返回的,而不是原始请求. 如果它是一个网络浏览器,用户无法重试,因为重新加载页面会再次返回错误页面,而不是重试他们最初失败的请求,这是他们想要的)。

无论如何...

HTTP 400 响应必须由您的应用程序代码生成,它不会自动完成。错误请求通常用于通知非人工代理(即 Web 服务客户端,不是 Web 浏览器)他们的 HTTP 请求缺少必需值或格式错误。

您可以在 MVC 中通过为所有控制器创建一个基本控制器类来做到这一点,如下所示:

public abstract class BaseController : Controller {

    protected ActionResult Http400(String message) {

        Response.StatusCode = 400;
        return View(message); // you need to define a view file called "Http400.aspx" (or cshtml if you're using Razor) in your application's shared views folder
    } 

}

所以在您的应用程序逻辑中:

public ActionResult Foobar() {

    if( IsBadRequest() ) return Http400("Bad request, try again");
}

【讨论】:

  • 其实我实现 Http400 动作的方式完全相同。我还在 web.config 中以这种方式定义了重定向路由 并且还映射了global.asax routes.MapRoute("HttpBadRequestError", "HttpBadRequestError/{action}/{id}", new { controller = "Error", action = "HttpBadRequestError", id = UrlParameter.Optional }) 中 HttpBadRequestError 的路由;但没有结果,错误的请求显示默认页面。
  • @Gohar 请不要使用重定向,ASP.NET 的 customErrors 功能中的重定向功能不支持 URL 路由名称。
  • 重定向是必需的,customErrors 重定向识别为 404 错误定义的路由名称没有问题
  • 为什么是要求?我的观点是执行重定向没有正当理由,实际上执行重定向违反了 HTTP 规范。
  • 实际上要求是显示 404 和 400 错误的自定义错误页面。但我应该创建一个通用机制来捕获所有错误。我无法在每个控制器操作中返回 Http400() 操作。我该怎么做?你能给我一些建议吗?
猜你喜欢
  • 2010-09-16
  • 2018-02-27
  • 1970-01-01
  • 2013-08-02
  • 2015-08-27
  • 2011-06-10
  • 2014-03-26
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多