Как добавить трассировку в управляемые модули IIS 7.0

Saad Ladki

Введение

IIS 7.0 и более поздние версии поддерживают подключение и использование настраиваемых управляемых модулей для выполнения самых различных задач и обработки всех видов содержимого. Однако возникает вопрос: что происходит, если модуль имеет проблемы или трудности? Ранее вы использовали System.Diagnostics для трассировки события при возникновении проблем. К сожалению, эти трассировки полностью отделены от трассировок IIS.

Не так с IIS 7.0 и выше. Теперь можно добавить трассировки в код модуля с помощью System.Diagnostics.TraceSource (новое для .Net 2.0). Эти трассировки можно направлять в инфраструктуру трассировки IIS, чтобы они были доступны модулям, используюющим трассировки, например трассировку неудачных запросов.

Команда IIS поощряет инструментирование кода с помощью базовых шаблонов, таких как:

  • СОБЫТИЯ START и STOP, связанные с ключевыми операциями в вашем коде
  • События WARNING и ERROR для непредвиденных случаев, которые могут привести к сбою запроса (например, ошибка аутентификации)
  • Информационные и Подробные события для помощи в диагностике, например используемой конфигурации модуля

Задачи, показанные в этом пошаговом руководстве, включают:

  • Добавление трассировки в модуль с помощью System.Diagnostics.TraceSource
  • Настройка трассировки неудачных запросов для фиксации этих трассировок.
  • Создание условия сбоя и просмотр результирующей трассировки

Необходимые условия

Выполните приведенные ниже действия перед выполнением задач в этой статье.

Шаг 1. Установка IIS

Сначала необходимо установить IIS. Проверьте, установлен ли IIS, перейдя в раздел http://localhost/. Если служба IIS установлена, вы увидите страницу "в стадии разработки". Если службы IIS не установлены, ознакомьтесь с инструкциями по установке IIS. Обязательно установите следующие компоненты IIS:

  • ASP (в разделе "World Wide Web Services=> Функции разработки приложений " => ASP)
  • ASP.Net (в составе служб World Wide Web => Функции разработки приложений => ASP.Net)
  • Трассировка (в разделе "Службы Всемирной паутины" => Работоспособность и диагностика => Трассировка)

Шаг 2. Вход от имени администратора

Войдите с учетной записью администратора или как часть группы "Администраторы".

Замечание

Находясь в группе "Администраторы", вы не получаете полных прав администратора по умолчанию. Необходимо запускать множество приложений от имени администратора. Щелкните правой кнопкой мыши значок приложения и выберите "Запуск от имени администратора".

Шаг 3. Создание резервной копии

Создайте резервную копию конфигурации перед выполнением задач в этой статье. Выполните следующее:

  1. Нажмите кнопку "Пуск"> — все программы —> аксессуары —> командная строка (r-click)—> запуск от имени администратора
    Снимок экрана: меню

  2. Выполните следующую команду в этой командной строке:

    %windir%\system32\inetsrv\appcmd add backup
    

Шаг 4. Создание примера содержимого

  1. Удалите все в папке c:\inetpub\wwwroot .
  2. В командной строке администратора, запущенной выше, вставьте вложенный код в файл в inetpub\wwwroot с именемtest.htm:
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).

Создание и трассировка простого модуля

В этом разделе вы создадите пример модуля для инструментирования.

Шаг 1. Создание простого модуля

С помощью командной строки администратора скопируйте и вставьте следующий код в файл с именем IIS_MOD_REQDATA.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
        }

        public void Dispose()
        {
        }
    }
}

Шаг 2. Добавление трассировки в управляемый модуль

Чтобы добавить трассировку в модуль и направить события трассировки в IIS, используйте источник System.Diagnostics.Trace. Добавьте следующую строку в инструкции using:

using System.Diagnostics;

Необходимо создать TraceSource в коде. Обратите внимание на определение traceSource в объявлении модуля IIS_MOD_REQDATA:

public class IIS_MOD_REQDATA : IHttpModule
{
    TraceSource tsStatus;

Элемент tsStatus инициализирован во время метода Init() IHttpModule:

public void Init(HttpApplication application)    
{    
    application.EndRequest += (new EventHandler(this.Application_EndRequest));
    // setup traceSource
    tsStatus = new TraceSource("tsStatus");    
}

Имя TraceSource (tsStatus) важно, так как это имя позже ссылается в файле web.config позже. Модуль теперь настроен для выдачи событий при необходимости.

Чтобы добавить новое событие трассировки, используйте tsStatus.TraceEvent(<type>, 0, <somestring>) для записи событий. Добавьте рекомендуемые события Start и End в метод Application_EndRequest():

private void Application_EndRequest(Object source, EventArgs e)        
{    
    tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

    // other code

    tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] END EndRequest");    
}

Обратите внимание, что поддерживаются различные <типы>, включая, среди прочего:

  • TraceEventType.Start
  • TraceEventType.Stop
  • TraceEventType.Error
  • TraceEventType.Warning
  • TraceEventType.Information
  • TraceEventType.Verbose

Для полноты можно скопировать весь источник модуля (включая события трассировки):

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {

        TraceSource tsStatus;

        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));

            // TRACING

            tsStatus = new TraceSource("tsStatus");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Req Data, moving onto Response");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            if (context.Response.StatusCode > 399)
            {
                tsStatus.TraceEvent(TraceEventType.Warning, 0, "[REQDATA MODULE] error status code detected");
            }

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Response Data");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] cache setting is (" + context.Response.Cache.ToString() + ")");

            tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] STOP - EndRequest");
        }

        public void Dispose()
        {
        }
    }
}

Шаг 3. Компиляция нашего трассированного модуля

Скомпилировать модуль и развернуть его. В командной строке администратора выполните следующую команду:

%systemroot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library /out:IIS_MOD_REQDATA.dll /debug /d:TRACE /R:System.Web.dll IIS_MOD_REQDATA.cs

Снимок экрана: команда consoleMain для восклицательного кода в Блокноте.

Замечание

Если вы работаете в 64-разрядной системе, скомпилируйте с помощью компилятора c# 64-разрядной версии в %windir%\microsoft.net\framework64\v2.0.50727\csc.exe

Обратите внимание на использование коммутаторов /debug и /d:TRACE . Эти коммутаторы необходимо использовать для компиляции событий трассировки в двоичный файл. Сбой компиляции с этими коммутаторами означает, что модуль не будет иметь в нем событий трассировки.

Скомпилировав модуль, разверните модуль и запустите начальный тест, чтобы узнать, работает ли модуль перед фиксированием его трассировки.

Добавление модулей в конфигурацию сайта

Этот раздел включает добавление и тестирование модуля.

Шаг 1. Добавление модуля в конфигурацию сайта

  1. Используя ту же командную строку администратора, создайте каталог с именем \inetpub\wwwroot\bin, а затем скопируйте IIS_MOD_REQDATA.dll в этот каталог.
  2. Включите модуль. В командной строке администратора введите inetmgr , чтобы открыть пользовательский интерфейс администрирования IIS.
  3. В области "Подключения" разверните имя локального компьютера, а затем "Сайты" и выберите "Веб-сайт по умолчанию".
  4. В разделе IIS в центральной области дважды щелкните модули:
    Снимок экрана: начальный экран веб-сайта по умолчанию с выделенным параметром
  5. Вы увидите большой список модулей, настроенных для использования этим сайтом. В правой части пользовательского интерфейса в разделе "Действия" нажмите кнопку "Добавить управляемый модуль":
    Снимок экрана: панель
  6. В окне, которое отображается, назовите управляемый модуль IIS_MOD_REQDATA , а тип модуля — IIS_MOD_REQDATA. IIS_MOD_REQDATA(выберите это в раскрывающемся списке):
    Снимок экрана: диалоговое окно
  7. Нажмите кнопку ОК. Теперь для использования веб-сайта настроен только что отслеживаемый модуль.
    Снимок экрана экрана

Шаг 2. Тестирование нашего модуля

Проверьте модуль, открыв Internet Explorer и перейдя в http://localhost/test.htm. Появится следующее окно:

Снимок экрана веб-страницы, на которой показан пример страницы, обслуживаемой статическим обработчиком файлов.

Содержимое "REQUEST HEADERS" и "RESPONSE HEADERS" поступило из нашего модуля, что означает, что это работает.

Маршрутизация событий в IIS

Эта задача подключает TraceSource модуля к трассировке IIS, чтобы его события проходили через IIS, а затем настроить трассировку проблемных запросов, чтобы фиксировать эти события трассировки.

Шаг 1. Включение traceSource модуля и маршрутизация его событий в IIS

Модуль обновлён для включения событий трассировки. Настройте System.Diagnostics и IIS для записи этих событий трассировки и маршрутизации их в модуль трассировки неудачных запросов IIS. Для этого настройте <раздел system.diagnostics> в файле web.config, чтобы настроить TraceSource и маршрутизировать его события соответствующим образом.

  1. С помощью командной строки администратора перейдите к c:\inetpub\wwwroot, и используйте Notepad для редактирования файла web.config.

  2. Существует 3 части конфигурации, которые необходимо завершить, чтобы события, генерируемые модулем, были направлены в инфраструктуру трассировки IIS:

    • Определение слушателя слежения за событиями IIS в качестве общего слушателя
    • Определение переключателя для включения всех событий
    • Определение источника трассировки, присоединение коммутатора, определенного нами, а также определение прослушивателя трассировки для нашего источника.
  3. IIS предоставляет новый System.Diagnostics.TraceListener, который используется для маршрутизации событий TraceSource в инфраструктуру отслеживания IIS. Этот поставщик также должен быть определен в файле web.config.

  4. Определите traceSource по имени (tsStatus) и подключите его к DefaultSwitch и IisTraceListener.

  5. Скопируйте и вставьте эту секцию <system.Diagnostics> в файл web.config (после вашей секции <system.webServer>).

    <system.diagnostics>
        <sharedListeners>
          <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </sharedListeners>
    
        <switches>
          <add name="DefaultSwitch" value="All" />
        </switches>
    
        <sources>
          <source name="tsStatus" switchName="DefaultSwitch">
            <listeners>
              <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </listeners>
          </source>
        </sources>
    </system.diagnostics>
    

TsStatus traceSource подключен к IIS7TraceListener, что приведет к отправке событий в инфраструктуру трассировки IIS. Перейдите к следующему шагу, чтобы связать эти события с поставщиком отслеживания неудачных запросов.

Шаг 2: Включение трассировки неудачных запросов с целью отслеживания событий трассировки модуля

Когда эти события диагностики создаются в инфраструктуре трассировки IIS, они сопоставляются с провайдером ASP.net и флагом модуля, относящимся к этому провайдеру. Их подробность зависит от используемого TraceEventType. Чтобы настроить трассировку неудачных запросов для их улавливания, выполните указанные ниже действия.

  1. В командной строке администратора введите start inetmgr. На панели "Подключения" разверните имя компьютера, а затем папку "Сайты", а затем щелкните веб-сайт по умолчанию. В правой части области "Действия" щелкните ссылку "Трассировка неудачных запросов"... в разделе "Настройка".
    Снимок экрана: раздел

  2. В следующем диалоговом окне настройте следующее:
    Снимок экрана: диалоговое окно

  3. Установите флажок "Включить ". Сохраните значения по умолчанию для других параметров. Нажмите кнопку ОК, чтобы продолжить.

  4. Теперь, когда мы проверили, включен ли ведение журнала трассировки неудачных запросов, необходимо настроить определения сбоев. Вернитесь в диспетчер IIS в разделе IIS, дважды щелкните правила трассировки неудачных запросов
    Снимок экрана: начальный экран веб-сайта по умолчанию с выделенным параметром

  5. В области "Действия" нажмите кнопку "Добавить".... Запустится мастер добавления правила трассировки неудачных запросов.

  6. На странице "Указание содержимого для трассировки " выберите параметр "Все содержимое" (*) для трассировки. Нажмите кнопку Далее.
    Снимок экрана страницы

  7. На экране "Определение условий трассировки " установите флажок " Коды состояния " и введите "200" в качестве кода состояния для трассировки.
    Снимок экрана: экран

  8. Нажмите кнопку Далее. Откроется страница выбора поставщиков трассировки . Установите флажки ASPNET и Модуль и Страница в секции "Области". В разделе "Подробное" выберите Подробно.
    Скриншот экрана выбора поставщиков трассировки, на котором выделен параметр ASPNET Provider.

    Замечание

    Из-за ошибки в сборках сервера Beta 3 трассировка модулей может быть записана только в том случае, если выбраны обе области: модуля и страницы. После Server Beta 3 для сбора этих событий требуется только модуль.

  9. Нажмите кнопку "Готово". Вы увидите следующее определение для веб-сайта по умолчанию:
    Снимок экрана: Экран с правилами трассировки неудачных запросов.

Тестирование и просмотр результатов

В этом задании мы создадим ошибочный запрос и просмотрим журнал трассировки результатов. Не забудьте, что мы настроили IIS для записи журналов трассировки для http://localhost/запросов*, которые ошибочно завершаются со статусом 200. Чтобы убедиться, что он работал:

  1. Откройте новое окно Internet Explorer. Введите адрес http://localhost/test.htm. Опять же, вы увидите следующее:
    Снимок экрана: пример веб-страницы в окне Internet Explorer.
  2. Чтобы проверить, что наш модуль создал трассировки, которые были записаны, используйте окно Internet Explorer с повышенными привилегиями администратора и нажмите клавиши CTRL-O, а затем перейдите к разделу c:\inetpub\logs\FailedReqLogFiles\W3SVC1. В раскрывающемся списке, который считывает HTML-файлы, выберите "Все файлы".
  3. Выберите последний файл fr######.xml (текущая дата) и нажмите кнопку "Открыть". Вы видите события:
    Снимок экрана: экран диагностики запросов с вкладкой

Сводка

Вы завершили добавление нового события трассировки в управляемый модуль, скомпилировали и развернули этот модуль, настроив маршрутизацию событий с помощью System.Diagnostics в инфраструктуру трассировки IIS, и, наконец, настроили функцию трассировки неудачных запросов IIS для захвата событий. Теперь вы можете легко добавить в модуль новые события, а затем перекомпилировать модуль и развернуть его в каталоге \bin. С помощью трассировки неудачных запросов вы можете увидеть результаты событий.

Помните, что использование System.Diagnostics.TraceSource позволяет по-прежнему использовать модуль и его события трассировки вниз по уровню, если вы подключили его к другому прослушивателю трассировки.