美好的一天!
我最近从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错误消息而不是我的处理程序。
提前致谢!
答案 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为错误案例引入了一个新的操作结果,但是没有使用它,可能会像框架的其他部分一样发臭。