【问题标题】:attribute does not seem to act at all属性似乎根本没有作用
【发布时间】:2011-12-28 02:53:00
【问题描述】:

我在使用控制器操作上的 [HandleError] 属性时遇到问题 - 它似乎根本不起作用(即过滤器是否存在并不重要 - 我得到相同的结果...... )。当抛出异常时,我会在“/”应用程序错误页面而不是我的自定义视图中看到标准的红色服务器错误。

我在 SO 上找到了关于该主题的其他几个线程,在大多数情况下,似乎在 web.config 中将 customErrors 选项设置为 On 解决了这个问题。它不适合我,所以我需要找到不同的解决方案。

我的控制器操作:

[HandleError]
public ActionResult Index()
{
    throw new Exception("oops...");
    return View();
}

在我的 web.config 文件中

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

我已确保 Error.aspx 文件也在共享目录中。我错过了什么?

我正在运行 ASP.NET MVC RC Refresh。

【问题讨论】:

    标签: asp.net-mvc error-handling attributes handleerror


    【解决方案1】:

    两个有用的知识:

    默认情况下,HandleError 在开发服务器下运行时不执行任何操作。目的是向开发者展示更多有用的信息:

    public virtual void OnException(ExceptionContext filterContext) {
        if (filterContext == null) {
            throw new ArgumentNullException("filterContext");
        }
    
        // If custom errors are disabled, we need to let the normal ASP.NET
        // exception handler execute so that the user can see useful
        // debugging information.
        if (filterContext.ExceptionHandled
            || ! filterContext.HttpContext.IsCustomErrorEnabled) {
            return;
        }
    

    请注意,这种情况正是customError 应该控制的。如果设置 customError="On" 不会改变这种行为:

    1. 检查您的语法。
    2. 确保您正在编辑项目根目录中的Web.config,而不是视图中的那个。
    3. 确保没有代码集HttpContext.IsCustomErrorEnabled
    4. 如果一切都失败了,请尝试在Web.config 中关闭调试

    其次,HandleError 永远不会处理某些类型的错误,尤其是 ASP.NET 编译错误。你没有说你遇到了什么错误。

    【讨论】:

    • 感谢您的回复!你的第一句话确实解释了为什么我看不到任何效果......有什么办法可以在上传到服务器之前在本地测试错误处理?如何?我的项目可以编译,但我故意抛出运行时异常来测试错误处理。
    • 你好。我现在尝试使用和不使用默认重定向的 customErrors="On",customErrors="Off",完全删除节点,并设置 debug="false" - 唯一的区别是红色错误上显示的信息页面...是调试还是使用 Cassini 导致问题?
    • 你说 Cassini 是指 ASP.NET 开发服务器吗?它们不一样,我不知道卡西尼是做什么的。
    • 是的,我就是这个意思。当我在 VS 中单击“播放”时默认运行的东西 =)我了解到它们实际上是相同的(在 WROX 的“初学者的 ASP.NET 2.0”中,如果我没记错的话......)。在 IIS 中调试会解决问题吗?
    • 我现在已将站点配置为在 IIS 中而不是在 ASP.NET 开发服务器上运行,但没有成功。这里有什么想法吗?
    【解决方案2】:

    您还需要指定要重定向到的页面。

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

    编辑:抱歉 /Shared/ 部分不应该在那里打赌,但您需要告诉 MVC 使用 Error.aspx 将用户发送到哪个页面。然后默认路由会在 shared 中查找名为 Error.aspx 的内容。

    已经很晚了! :) 我想这就是为什么有人给我一个减号的答案! :) 至少它在这里有效!

    【讨论】:

    • 另外,根据这篇文章weblogs.asp.net/scottgu/archive/2008/07/14/…,它不应该是必要的(这是我能找到的最新的,虽然它只在PV4上......)
    • 我读过那篇文章,但对我来说,除非我说重定向到哪里,否则错误不会被处理。
    • 在我的 web.config 我写 ,当抛出异常时,我在这个 url 上得到 404:@ 987654322@
    【解决方案3】:

    我遇到了同样的问题,我花了整整两天的时间才弄清楚。结果是我在 Site.Master 页面中出现错误,并且 Error.aspx 使用与所有其他页面相同的母版页。显然 Error.aspx 无法处理这种情况。

    我的解决方案是创建一个轻量级且不包含任何模型数据的特定 Error.master 页面。另外,我创建了一个静态 Error.htm,以防 Error.aspx 发生错误。 Web.config设置如下:

    <customErrors mode="On">
        <error statusCode="500" redirect="Error.htm" />
    </customErrors>
    

    希望对你有帮助。

    【讨论】:

    • 我的 Error.aspx 页面也抛出了自己的异常。调试起来很痛苦!
    • Error.htm 似乎返回了 200 的 HTTP 响应状态代码,而不是它应该返回的 500!
    【解决方案4】:

    这个问题的另一个原因可能是,

    在 Template MVC Application(由 VS2008 / VS2008 Express 生成)中,Error.aspx(由 VS 生成)使用 Master Page。

    如果母版页访问任何 ViewData 它将抛出空引用 Exception ,那么 error.aspx 将不会显示。

    将此简单代码用作您的 Error.aspx ,它将解决问题(以及 CustomErrors=On )

    <%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
    <%= Model.Exception.Message %>
    

    【讨论】:

      【解决方案5】:

      为了在应该显示 Error.aspx 时解决 404 问题,我必须从 httpHandler 部分中排除 Error.aspx,这会阻止直接访问任何视图(围绕 mvc 2 框架)。我通过将 Error.aspx 放在“错误”子文件夹中并将 web.config 放在此子文件夹中并带有 &lt;remove path="*" verb="*" /&gt; 在 httpHandlers 部分。我对这个问题的版本(及其解决方案)可能特定于 MVC 2。

      当你移动 Error.aspx 时,记得更新 defaultRedirect 引用:)

      【讨论】:

        【解决方案6】:

        我尝试了上述建议,但对我没有任何帮助。诀窍是从我的错误控制器中的操作中删除这一行。

        Response.StatusCode = (int)HttpStatusCode.NotFound;
        

        由于 IIS 错误消息一直在拦截我的错误处理,因此我不得不抓狂。虽然它并不理想,因为我想在响应中提供该状态代码,但我发现删除它可以防止 IIS 7+ 干扰我的错误处理。

        大部落

        【讨论】:

        • 如果你想使用这个,你可以,你需要先设置Response.TrySkipIisCustomErrors = true
        猜你喜欢
        • 1970-01-01
        • 2016-07-20
        • 2020-08-03
        • 1970-01-01
        • 2010-11-16
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        相关资源
        最近更新 更多