ASP.NET MVC 2和IIS 7.0的错误处理

时间:2010-08-23 08:39:59

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

美好的一天!

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

我想要实现的目标:

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

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

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

  • 如果VS开发服务器的这个错误处理工作相同(我知道IIS Express,但现在我应该坚持使用VS Dev服务器)

我用过这个: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错误消息而不是我的处理程序。

提前致谢!

1 个答案:

答案 0 :(得分: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为错误案例引入了一个新的操作结果,但是没有使用它,可能会像框架的其他部分一样发臭。