gpt4 book ai didi

asp.net-mvc - 如何将服务器错误的http状态代码捕获到ASP.NET MVC中的常规自定义错误 View 中

转载 作者:行者123 更新时间:2023-12-03 07:42:04 24 4
gpt4 key购买 nike

我正在尝试在ASP.NET MVC 4中实现常规的自定义错误页面。
我基本上设置了一个错误布局,它定义了一个用于输出响应的http状态代码的部分。

我希望错误最终出现的 View 继承了这种布局,并简单地添加了一条来自其模型的消息,该消息已实例化并传递给我设置的Controller中对View()的调用(名为“Error”)在web.config中处理自定义错误。

<customErrors defaultRedirect="/Error" mode="On"> 
</customErrors>

自定义错误 Controller :
public class ErrorController : Controller
{
public ActionResult Index()
{
return View(new CustomErrorViewModel(Response.Status));
}
}

自定义错误 View :
@{
Layout = "~/Views/Shared/_CustomErrorLayout.cshtml";
}

@using System.Web.Configuration;
@using System.Configuration;
@using MVC_Tests.Models;
@model CustomErrorViewModel

@section HttpCode { @Response.StatusCode }

@Model.Status

布局为:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
<link href="~/Content/CustomError.css" rel="stylesheet" />
</head>
<body>
<div id="divError">
<h1>
<span>Error &nbsp;</span>
@RenderSection("HttpCode")
</h1>
<div id="divErrorMessage">
<p>@RenderBody()</p>
</div>
</div>
</body>
</html>

我要处理的错误是我向Home Index操作添加的零除。请注意,我想要一个 单一 View 来处理不同的服务器HTTP状态错误代码(500系列)。 我知道每个不同的http状态代码都有不同的 View ,我只想使用一个 View 来处理多个代码。

自定义错误处理有效,我以所需的 View 结尾-但是-如上所述,我希望输出错误的http状态代码。
相反,我始终显示200(确定),根据我的理解和调试,发生此事件的原因是:

1. 首先,在被零除绊倒时,引发了异常。

2. 现在,由于我的web.config指令以自定义方式处理错误(由于未在web.config中指定特定的HTTP状态代码,因此我在同一 Controller /中处理每个http状态错误代码),因此发生了重定向view(“/Error”)。这里的关键是重定向是一个 新的请求。

3. 。从步骤2进行的重定向将我发送到错误 Controller ,然后将我发送到其 View ,该 View 已呈现。

4. 在渲染 View 时,将http状态代码插入到布局定义的部分中,添加了我的自定义消息,并且http状态代码部分的输出如我所说:200(确定)。为什么,如果强行抛出500服务器端错误?因为,如果我没有记错的话,该 View 将在另一个请求管道,一个重定向请求管道中进行渲染,并且在重定向过程中-没有错误发生-我最终得到200(OK)状态响应。

我翻阅了Dino Esposito关于asp.net mvc中处理错误的 this帖子,但是我不想向所有应用程序的 Controller 添加过滤器(OnException和HandleError属性解决方案)(我可以创建一个具有此类过滤器的新基本 Controller ,并使所有其他继承自它,但这还需要更改所有 Controller 类)。他提到的最后一种方法(处理global.asax的Application_Error事件)我不能确定是否达到此目的-我必须在处理程序中发出重定向“Response.Redirect”语句,这超出了设置自定义页面的灵活性在web.config中(我仍然可以重定向到web.config中定义的路由,但我想知道对于看起来如此简单的内容来说,这是否变得不太麻烦)。

将任何服务器错误的响应的HTTP状态代码捕获到我的自定义错误 View 中的最佳方法是什么?

最佳答案

如果您使用的是IIS7 +,则将禁用“customerrors”,如下所示:

 <customErrors mode="Off" />

并像这样使用httpErrors:
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" defaultPath="/error">
<remove statusCode="404" />
<error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
</httpErrors>
....

这样,您就可以在 Controller 中使用以下命令获取显示非URL错误的错误页面,并显示404状态代码:
public class ErrorController : Controller
{
public ActionResult notfound()
{
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View("OneErrorViewToRuleThemAll");
}
}

ps。 “errorMode”需要更改为“Custom”才能在本地查看....取决于您的本地设置(即,如果您使用的是IISExpress),在上传到实时服务器之前,可能看不到正确的错误。

pps。您可以使用单个 View “OneErrorViewToRuleThemAll”来处理您决定以这种方式处理的任何状态代码的屏幕输出。每个ErrorController Action将最终出现在此 View 上。

关于asp.net-mvc - 如何将服务器错误的http状态代码捕获到ASP.NET MVC中的常规自定义错误 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28989026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com