gpt4 book ai didi

c# - 使用 IIS7 httpErrors 将异常传递给自定义错误页面

转载 作者:太空狗 更新时间:2023-10-29 23:41:05 28 4
gpt4 key购买 nike

我创建了一个 ASP.NET MVC 3 应用程序,使用 httpErrors 处理向用户显示错误消息等。该代码工作正常,并在下面复制。

<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom">
<clear/>
<error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL"/>
<error statusCode="404" subStatusCode="-1" path="/Error/NotFound" responseMode="ExecuteURL"/>
<error statusCode="500" subStatusCode="-1" path="/Error/ServerError" responseMode="ExecuteURL"/>
</httpErrors>

当 Controller 发生异常时,BaseController.OnException被触发(BaseController是我自己创建的类)。我想在该函数中做的是存储异常,以便我的 ServerError 操作可以查看其类型和消息以确定向用户显示什么。整个方法复制如下。

protected override void OnException(ExceptionContext filterContext)
{
// doesn't work
this.TempData["exception"] = filterContext.Exception;

// doesn't work
this.Session["exception"] = filterContext.Exception;

// temporary hack
ErrorController.RequestExceptions[this.Request.UserHostAddress] = filterContext.Exception;
base.OnException(filterContext);
}

当请求到达 ErrorController 实例时(ErrorController 在不同的命名空间中,但我认为这不相关),由于某种原因 Server .GetLastError() 返回 null,TempData 为空,Session 为空,Session.IsNewSession 为真。我试图通过让应用程序存储某种请求 ID 来解决这个问题,但这似乎不存在,现在我得到的最好的解决方案是这个非常 hacky“通过请求 IP 存储它,然后删除它会在 ErrorController 接收到它后立即发送。”

这(令人惊讶地)有效,但必须有一个更安全、更具可扩展性的解决方案。我不确定为什么清除 TempData 或为什么重新启动 Session - 是因为错误,还是这算作两个单独的请求?无论如何,是否有解决方法来获得所需的行为?

附言如果可能的话,我更愿意使用 web.config 中的 httpErrors 条目而不是 Application_Error 中的代码:这似乎是一个更清晰、更具声明性的解决方案。

附言我发现了一篇关于重定向期间 session 对象问题的文章(link),但它说问题已得到解决。我遇到的大多数其他事情都与旧的 customErrors 系统有关,但我会继续寻找。

最佳答案

MVC 具有处理异常和显示自定义 View 的内置支持。默认情况下,MVC 将 HandleErrorAttribute 添加到 Global.asax.cs 文件中的 RegisterGlobalFilters 方法。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

您需要将名为 Error 的 View 添加到 Shared View 文件夹。该 View 将有一个 HandleErrorInfo 类型的模型,它作为一个名为 Exception 的属性来获取抛出的异常

@model System.Web.Mvc.HandleErrorInfo

@Model.Exception.Message

关于c# - 使用 IIS7 httpErrors 将异常传递给自定义错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8515182/

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