首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将服务器错误的http状态代码捕获到ASP.NET MVC中的通用自定义错误视图中?

如何将服务器错误的http状态代码捕获到ASP.NET MVC中的通用自定义错误视图中?
EN

Stack Overflow用户
提问于 2015-03-11 14:15:07
回答 2查看 2.6K关注 0票数 2

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

我希望我的错误在继承这样的布局时结束,并简单地添加来自其模型的消息,该消息是在web.config中为处理自定义错误而设置的Controller (称为"Error")中的视图()调用中实例化和传递的。

代码语言:javascript
运行
复制
<customErrors defaultRedirect="/Error" mode="On"> 
</customErrors>

自定义错误控制器

代码语言:javascript
运行
复制
public class ErrorController : Controller
{
    public ActionResult Index()
    {
        return View(new CustomErrorViewModel(Response.Status));
    }
}

自定义错误视图

代码语言:javascript
运行
复制
@{
    Layout = "~/Views/Shared/_CustomErrorLayout.cshtml";
}

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

@section HttpCode { @Response.StatusCode }

@Model.Status

布局是:

代码语言:javascript
运行
复制
<!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>

我试图处理的错误是一个简单的除法,我将其添加到主索引操作中。请注意,我需要一个单视图来处理不同的服务器http状态错误代码(500个系列)。我知道每个不同的http状态代码都有不同的视图,我只需要一个视图来处理多个代码。

自定义错误处理工作正常,我以所需的视图结束--但是--如上所述,我希望输出错误的http状态代码。相反,我总是显示200 (OK),根据我的理解和调试,这是因为:

1.首先,当被零的除法绊倒时,会引发异常。

2.现在发生了重定向,因为我的web.config指令以自定义的方式处理错误(因为web.config中没有指定特定的http状态代码,所以在同一个控制器/视图("/Error")中处理每个http状态错误代码)。这里关键的是重定向是一个新的请求。

3.从步骤2重定向将我发送到Error Controller,然后它将我发送到它的视图,该视图将被呈现。

4.在呈现视图时,将http状态代码插入到布局定义部分,添加了我的自定义消息,并且http状态代码部分的输出为: 200 (OK)。为什么,如果一个500服务器端错误被强制抛出?因为,如果我没有错,视图将在不同的请求管道、重定向管道中呈现,并且在重定向过程中--没有出现错误--而我最终得到了200 (OK)状态响应。

我浏览了迪诺·埃斯波西托( Dino Esposito )的文章,其中提到了如何处理asp.net mvc中的错误,但我不想将过滤器(OnException和HandleError属性解决方案)添加到应用程序的控制器中(我可以创建一个新的带有这种过滤器的基本控制器,并让所有其他控制器继承它,但这也需要更改所有控制器类)。他提到的最后一种方法(处理global.asax的Application_Error事件)--我不确定--我必须在处理程序中发出一个重定向"Response.Redirect“语句,这比在web.config中设置自定义页面的灵活性要好(我仍然可以重定向到web.config中定义的路由,但我不知道对于看起来如此简单的事情来说,这是否太麻烦了)。

-

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-11 16:05:10

如果使用IIS7+,我会禁用“定制错误”,如下所示:

代码语言:javascript
运行
复制
 <customErrors mode="Off" />

然后像这样使用httpErrors:

代码语言:javascript
运行
复制
<system.webServer>
 <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" defaultPath="/error">
     <remove statusCode="404" />
     <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
 </httpErrors>
....

这使您可以使用控制器中的以下内容获得一个非url更改错误页,并显示404状态代码:

代码语言:javascript
运行
复制
public class ErrorController : Controller
{
public ActionResult notfound()
    {
        Response.TrySkipIisCustomErrors = true;
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View("OneErrorViewToRuleThemAll");
    }
}

ps。"errorMode“需要更改为”自定义“,以便在本地设置(即,如果使用IISExpress)上看到它,在上传到活动服务器之前,您可能不会看到正确的错误。

pps。您可以使用单一视图"OneErrorViewToRuleThemAll“来处理您决定以这种方式处理的任何状态代码的屏幕上输出。每个ErrorController操作都将在此视图上结束。

票数 1
EN

Stack Overflow用户

发布于 2015-03-29 09:15:20

我正在寻找的解决方案(在濒临放弃之后)被描述为这里

总结这些步骤:

  1. 将您的web.config设置为针对要处理的每个错误重定向到控制器操作。
  2. 在1.中定义的每个操作中,将响应对象的TryToSkipCustomErrors属性设置为true。
  3. 从您的filters.Add(new HandleErrorAttribute());文件中删除一行.

使用这种方法,我终于成功地将错误500重定向到自定义页面。500似乎存在某种默认的跳过,因为为错误404设置自定义页不需要步骤2或步骤3。

因此,最后,对于我希望呈现自定义页面的每个http状态代码,我创建一个控制器操作,相应地设置所描述的属性,然后对所有操作重定向到相同的视图--在其中显示@Response.Status,使其足够成为我的通用解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28989026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档