C# MVC 5错误处理Web.Config自定义错误

C# MVC 5错误处理Web.Config自定义错误,c#,asp.net-mvc,error-handling,web-config,C#,Asp.net Mvc,Error Handling,Web Config,我正在探索不同类型的错误处理,并尝试设置一些自己的错误处理 我的第一次尝试是在web.config文件中使用customErrors部分。我已经设置了两个错误部分。一个用于404错误,另一个用于403错误。在我的一个控制器中,我设置了Response.StatusCode=404和邮递员收到404状态。然而,我的页面被打开了,并且状态从未被捕获 也许我错过了什么。下面是我的样本 控制器: public ActionResult PostAuditReport() { Respon

我正在探索不同类型的错误处理,并尝试设置一些自己的错误处理

我的第一次尝试是在web.config文件中使用customErrors部分。我已经设置了两个错误部分。一个用于404错误,另一个用于403错误。在我的一个控制器中,我设置了
Response.StatusCode=404和邮递员收到404状态。然而,我的页面被打开了,并且状态从未被捕获

也许我错过了什么。下面是我的样本

控制器:

public ActionResult PostAuditReport()
{
        Response.StatusCode = 404;
        return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}
Web.Config:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.cshtml">
  <error statusCode="404" redirect="~/Error/NotFound"/>
  <error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>

您正在将响应的statuscode设置为404,但仍将视图作为响应。尝试使用异常导致404错误:

throw new HttpException(404, "Not Found");
使用此选项,您将导致代码的执行停止,并出现404错误,该错误将由errorhandling接收。(在本例中,在web.config中)

上面的代码按它应该的方式工作。它为PostAuditReport的视图提供状态代码404,而不是200。如果要为404视图提供自定义消息,则需要以下内容-

Global.asax.cs 诀窍是不要对404-NotFound使用重定向,以避免往返

以下代码将呈现404的NotFound视图,同时在浏览器中维护原始URL

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();

   // Log exception to database if you want to.

    // Process 404 HTTP errors
    var httpException = exception as HttpException;
    if (httpException != null && httpException.GetHttpCode() == 404)
    {
        Response.Clear();
        Server.ClearError();
        Response.TrySkipIisCustomErrors = true;

        IController controller = new ErrorController();

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "NotFound");

        var requestContext = new RequestContext(
             new HttpContextWrapper(Context), routeData);
        controller.Execute(requestContext);
    }
}
误差控制器 您需要为以下操作方法创建单独的视图

public class ErrorController : Controller
{    
    [AllowAnonymous]
    public ActionResult BadRequest()
    {
        Response.StatusCode = 403;
        Response.TrySkipIisCustomErrors = true;

        return View();
    }    

    [AllowAnonymous]
    public ActionResult NotFound()
    {
        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;

        return View();
    }

    [AllowAnonymous]
    public ActionResult Error()
    {
        Response.StatusCode = 503;
        Response.TrySkipIisCustomErrors = true;

        return View();
    } 
}
*仅供参考:您无法指向Error.cshtml。默认情况下,由于安全原因,IIS不会提供.cshtml服务

应该是这样的-

<customErrors defaultRedirect="~/Error/Error" mode="On">
  <error statusCode="404" redirect="~/Error/NotFound"/>
  <error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>


现在确实会引发404异常,但我的web.config没有发现异常。我得调查一下。谢谢。我喜欢这个答案,因为我更喜欢使用应用程序错误来处理全局错误。谢谢你提供的信息。
<customErrors defaultRedirect="~/Error/Error" mode="On">
  <error statusCode="404" redirect="~/Error/NotFound"/>
  <error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>