Обработка ошибок для ASP.NET MVC 2 и IIS 7.0 - PullRequest
3 голосов
/ 23 августа 2010

Добрый день!

Я недавно перешел с 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 Development Server (я знаю о IIS Express, но сейчас я должен придерживаться VS Dev Server)

Я использовал это: 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 Ответ

1 голос
/ 23 августа 2010

я использую

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 представил новый результат действия для случаев ошибки, но не использовал его, вероятно, воняет, как и остальная часть платформы.

...