Отладка httpmodule на сервере разработки asp.net

Я хочу интегрировать некоторые http-модули в мое приложение asp.net(v 3.5, visual studio 2008), и я не уверен, как отлаживать или использовать такие модули при отладке сервера разработки asp.net, который срабатывает, когда я запустите веб-приложение.

Нужно ли включать источник модуля в решение или я могу просто удалить DLL в BIN? Я из мира 1.1 и еще не привык к серверу разработки asp.net.

Ответ 1

Выполните следующие шаги, чтобы добавить HTTP-модуль:

  • Создайте новый проект библиотеки Visual Studio.NET С# с именем MyModule.
  • Установите ссылку на сборку System.Web.dll.
  • Добавьте в класс следующую директиву:

    using System.Web;                    
    
  • Переименуйте класс SyncModule.cs, а затем измените определение класса, чтобы отразить это.

  • Внедрить интерфейс IHttpModule. Определение вашего класса должно выглядеть следующим образом:

    public class SyncModule : IHttpModule                    
    
  • Определите, какие события вы будете подписывать. В следующем списке перечислены доступные события из объекта HttpApplication, на который вы можете подписаться:

    • AcquireRequestState: Вызовите это событие, чтобы модуль мог получить или создать состояние (например, сеанс) для запроса.
    • AuthenticateRequest: вызывать это событие, когда модуль безопасности должен аутентифицировать пользователя перед его обработкой.
    • AuthorizeRequest: вызывать это событие модулем безопасности, когда запрос должен быть разрешен. Вызывается после аутентификации.
    • BeginRequest: Вызовите это событие, чтобы уведомить модуль о начале нового запроса.
    • Disposed: Вызовите это событие, чтобы уведомить модуль о завершении приложения по какой-либо причине. Позволяет модулю выполнять внутреннюю очистку.
    • EndRequest: Вызовите это событие, чтобы уведомить модуль о завершении запроса.
    • Error: Вызовите это событие, чтобы уведомить модуль об ошибке, которая возникает во время обработки запроса.
    • PostRequestHandlerExecute: Вызовите это событие, чтобы уведомить модуль о завершении обработки обработчиком запроса.
    • PreRequestHandlerExecute: Вызовите это событие, чтобы уведомить модуль о вызове обработчика запроса.
    • PreSendRequestContent: Вызовите это событие, чтобы уведомить модуль о том, что содержимое будет отправлено клиенту.
    • PreSendRequestHeaders: Вызовите это событие, чтобы уведомить модуль о том, что HTTP-заголовки будут отправлены клиенту.
    • ReleaseRequestState: Вызовите это событие, чтобы позволить модулю освободить состояние, потому что обработчик завершил обработку запроса.
    • ResolveRequestCache: вызывать это событие после аутентификации. Модули кэширования используют это событие, чтобы определить, должен ли запрос обрабатываться его кешем или обработчик должен обработать запрос.
    • UpdateRequestCache: Вызовите это событие после ответа обработчика. Кэширующие модули должны обновить свой кэш с ответом.
  • Внедрите методы Init и Dispose интерфейса IHttpModule следующим образом:

    public void Init(HttpApplication app)
    {
       app.BeginRequest += new EventHandler(OnBeginRequest);
    }
    public void Dispose(){ }
    
  • Создайте делегат для события следующим образом:

    public delegate void MyEventHandler(Object s, EventArgs e);    
    
  • Определите приватную локальную переменную типа MyEventHandler для хранения ссылки на событие:

    private MyEventHandler _eventHandler = null;                    
    
  • Создайте событие, которое подключает делегат к методу в файле или классе Global.asax, который наследует объект HttpApplication:

    public event MyEventHandler MyEvent
    {
       add { _eventHandler += value; }
       remove { _eventHandler -= value; }
    }
    
  • Создайте метод OnBeginRequest, который подключается к событию BeginRequest HttpApplication:

    public void OnBeginRequest(Object s, EventArgs e)
    {
       HttpApplication app = s as HttpApplication;
       app.Context.Response.Write("Hello from OnBeginRequest in custom module.<br>");
       if(_eventHandler!=null)
          _eventHandler(this, null);
    }        
    
  • Скомпилировать проект

источник: http://support.microsoft.com/kb/307996

Добавление HTTP-модуля в ваш web.config будет выглядеть примерно так:

<system.web>
    <httpModules>
       <add name="CustomHttpModule" type="MyCustomHttpModule"/>
    </httpModules>
</system.web>

Ответ 2

Две распространенные причины для точек останова, которые не попадают в HttpModule:

Точка останова находится в коде, который вызывается во время построения модуля.

Это всегда меня. Если вы хотите отладить конструкцию модуля , вы должны вручную прикрепить отладчик. Для этого в Windows 7 (это будет похоже на Vista):

  • Отладка | Присоединитесь к процессу...
  • Отметьте Показать процессы во всех сеансах.
  • Выберите экземпляр рабочего процесса (w3wp.exe)
  • Нажмите "Прикрепить".

Обновите свой браузер, и теперь вы должны нажать на точку останова.

Модуль фактически не загружается из-за проблемы с конфигурацией.

Если вы можете сказать, что код модуля определенно выполняется, это не проблема. Но иногда, когда модуль загружается отлично на других машинах, он может не загружаться в вашем блоке dev, потому что у вас есть другая версия IIS, и у вас нет необходимой конфигурации.

Если это так, убедитесь, что модуль подключен правильно для всех требуемых версий IIS.

Для IIS 5.1 и IIS 6...

<system.web>
  <httpModules>
    <add name="CustomHttpModule" type="MyCustomHttpModule"/>
  </httpModules>
</system.web>

... и для IIS 7 +

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHttpModule" type="MyCustomHttpModule"/>
  </modules>
</system.webServer>

Ответ 3

Обратите внимание, что это не работает из коробки. Убедитесь, что вы не просто включаете новое имя класса модуля, а явно определяете его пространство имен и (для черновой полноты) сборки. Если вы этого не сделаете, у вас будет хороший шанс, что IIS жалуется, что вы не сможете загрузить этот новый HTTP-модуль, который вы только что закодировали.

Далее следует пример.

Вместо:

<add name="CustomHttpModule" type="MyCustomHttpModule"/>

Использование:

<add name="CustomHttpModule" type="MyCustomRootNamespace.MyCustomHttpModule, MyCustomAssembly"/>

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

Конкретные ошибки, которые вы можете получить, зависят от того, как явно вы определили модуль. Если вы оставите пространство имен, вы увидите:

Could not load type 'MyCustomHttpModule'.

Оставьте пространство имен и включите сборку, и вы увидите:

Could not load type 'MyCustomHttpModule' from assembly 'MyCustomAssembly'. 

Если вы видите другое сообщение об ошибке, у вас возникает другая проблема, чем обсуждаемая здесь.

Ответ 4

Вы можете написать строку

System.Diagnostics.Debugger.Break();//Явное вызов Break для отладки

для явного вызова точки прерывания во время HttpModule consturction.

Он попросит приложить процесс (например, w3wp.exe), после чего удалите точку отладки.

Спасибо

Ответ 5

Вы также можете убедиться, что используете проекты веб-приложений, которые вы использовали в VS2003, а не "проекты" веб-сайта, которые не являются проектами.