Skip to main content
 首页 » 编程设计

c#之MVC 5 错误处理 Web.Config customErrors

2024年04月12日40linjiqin

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

我的第一次尝试是使用 web.config 文件中的 customErrors 部分。我设置了两个错误部分。一个用于 404 错误,另一个用于 403。在我的一个 Controller 中,我设置了 Response.StatusCode = 404; 并且 postman 收到了 404 状态。但是,我的页面已提供并且状态从未被捕获。

也许我遗漏了什么。下面是我的示例。

Controller :

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

网络配置:

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

请您参考如下方法:

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

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

全局.asax.cs

诀窍是不要对 404 - NotFound 使用 Redirect 以避免往返。

以下代码将为 404 呈现 NotFound View ,同时在浏览器中保持原始 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); 
    } 
} 

错误 Controller

您需要为以下操作方法创建单独的 View 。

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>