2012-03-20 2 views
1

Для веб-сайта/vpath можно обрабатывать событие Application_Error, чтобы уловить ошибки, прежде чем они будут отправлены обратно в браузер. Возможно ли так сделать это на уровне сервера? То есть определите метод на корневом уровне, который будет выполняться, если на веб-сайте произошла ошибка, но на какой-либо причине этот сайт не справляется с ошибкой.Как определить логику обработки ошибок на уровне сервера

Я знаю, что вы можете использовать web.config на корневом уровне, чтобы определять настраиваемые сообщения об ошибках для каждого кода состояния HTTP. Однако это не идеально для моего случая, потому что я хочу возвращать различные типы контента (то есть HTML или что-то еще) в зависимости от логики приложения.

ответ

1

Пользовательский http-модуль может быть зарегистрирован в applicationHost.config. Затем этот модуль используется всеми приложениями IIS на целевой машине.

1) Создать подписанный проект библиотеки классов с модулем HTTP:

public class ErrorHandlingModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication context) 
    { 
     context.Error += new EventHandler(context_Error); 
    } 

    void context_Error(object sender, EventArgs e) 
    { 
     // handle error 
    } 
} 

2) Install библиотеку классов в GAC, так что он может быть общим для всех IIS приложений.

3) Install http-модуль к файлу приложенияHost.config. Обычно этот файл находится в папке C: \ Windows \ System32 \ inetsrv \ config. Доступ к файлам в этой папке можно получить только с помощью 64-битных процессов (такой проблемы нет в 32-разрядных операционных системах), VS2010 не может их видеть, но Explorer может. Фрагмент applicationHost.config может выглядеть так:

<location path="" overrideMode="Allow"> 
    <system.webServer> 
     <modules> 
      <add name="MyModule" preCondition="managedHandler" type="GlobalErrorHandler.ErrorHandlingModule, GlobalErrorHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bfd166351ed997df" /> 
+0

Спасибо, это именно то, что я искал! Один последующий вопрос, если вы не возражаете: если у меня есть этот модуль, а также обрабатывать Application_Error в global.asax, который будет вызван первым? – McGarnagle

+0

Рад, что это помогло. В моем случае HTTP-модуль вызывается первым. Но я не думаю, что это гарантировано, по крайней мере, я не могу найти документацию, в которой упоминается порядок выполнения обработчиков событий приложения. Пожалуйста, дайте мне знать, если вы найдете что-то в этой теме :). –

0

Непонятно, каков ваш вопрос, но согласно моему пониманию. внутри application_error вы можете использовать,

Server.GetLastError() to get last error occured in server level. 
+0

Обновлен вопрос для наглядности. Мой вопрос заключается в том, есть ли у вас блок кода, который ловит любые ошибки, которые веб-сайты не могут поймать. Так эффективно, как global.asax application_on_error для всего сервера, а не для каждого отдельного приложения. – McGarnagle

+0

Я думаю, вы можете видеть только в случае viwer. –

Смежные вопросы