【问题标题】:Error handling for ASP.NET MVC 2 and IIS 7.0ASP.NET MVC 2 和 IIS 7.0 的错误处理
【发布时间】:2011-04-02 12:48:48
【问题描述】:

美好的一天!

我最近从 IIS 6.0 切换到 IIS 7.x,我正在寻找我梦想中的 ASP.NET MVC 2 错误处理技术。

我想要达到的目标:

  • 在一处处理所有未处理的异常(最好在 Global.asax 处理程序中)

  • 404 和 403 错误的自定义处理程序(适用于 MVC 控制器\操作和静态文件)。这些处理程序不应执行重写,而应发送 HTTP 错误代码。 例如,如果用户导航到http://example.com/non-existing-page/,他应该保留在此 URL 上,但会获得 HTTP 404 状态和自定义 404 页面。

  • 能够以编程方式从操作触发 404 和 403 错误。例如,如果用户在分页中指定了不存在的页码,如下所示:http://example.com/posts/page-99999/

  • 如果这种错误处理对 VS 开发服务器同样有效,那就太好了(我知道 IIS Express,但现在我应该坚持使用 VS 开发服务器)

我用过这个:http://blogs.microsoft.co.il/blogs/shay/archive/2009/03/06/real-world-error-hadnling-in-asp-net-mvc-rc2.aspx 虽然在 IIS 6.0 上,但现在在带有集成管道的 IIS 7.0 上,我看到的是 IIS 错误消息而不是我的处理程序。

提前致谢!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 iis-7 iis-6


    【解决方案1】:

    我用

    protected void Application_Error(object sender, EventArgs e)
    

    在我的Global.asax.cs

    要捕获所有未经处理的异常,在其中执行以下操作:

    try
    {
        Response.Clear();
        var errorController = new ErrorController();
        var result = errorController.Error(statusCode, exception);
        result.ExecuteResult(new ControllerContext(new RequestContext(new HttpContextWrapper(Context), routeData), errorController));
        Server.ClearError();
    }
    catch(Exception e)
    {
        HttpContext.Current.Response.StatusCode = 500;
        HttpContext.Current.Response.Write(e.Message);
    }
    

    我的错误控制器如下所示:

    public ActionResult Error(HttpStatusCode statusCode, Exception exception)
    {
        var resource = new ErrorResource(statusCode, exception);
        this.response.StatusCode = resource.StatusCode;
    
    #if !DEBUG
        return View("ReleaseError", resource);
    #endif
    
        return View("DebugError", resource);            
    }
    

    我可以这样做:

    throw new HttpException(404, "not found");
    

    throw new HttpException(403, "not found);
    

    以编程方式等。

    我认为 MVC2 为错误情况引入了一个新的操作结果,但没有使用它,可能像框架的其余部分一样臭。

    【讨论】:

    • -1 因为您的最后一条评论。太糟糕了,因为我喜欢你的解决方案。
    • 如果你认为 ASP.NET MVC 是一个很好的框架,那你就大错特错了。老实说,我没有粗鲁。你用过 Rails 或 OpenRasta 吗? MVC 的一切都设计得很糟糕,路由、伪请求“管道”(我在最宽松的意义上使用这个术语)、控制器概念、动作结果及其调用、错误处理和 WebForms 视图引擎。说真的,告诉我为什么 MVC 的任何部分都很好地组合在一起?
    • 感谢您的回答,IIS 级别本身的自定义错误设置呢?
    • @Andrew,否决票不是因为我不同意您的评论,而是我觉得关于函数/方法的 SO 问题不适合对框架的优点进行主观评论。我认为使 SO 成为如此好的网站的部分原因是“框架 X 是 sux”cmets 的最小感叹词。火焰战争已经开始了 :)
    • @artvolk 我在 IIS 中设置了一个 500 秒的平面 HTML 页面,以防万一一切都死了。这必须只是一个 html 页面(没有服务器端代码),因为如果 iis 遇到这个问题,那就是严重错误(比如 asp.net 无法正常工作)
    猜你喜欢
    • 2011-05-20
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2018-02-27
    • 2011-06-10
    • 2014-03-26
    • 2012-10-04
    相关资源
    最近更新 更多