Поделиться через


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

Саад Ладки (Saad Ladki)

Введение

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

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

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

  • События START & STOP, связанные с ключевыми действиями в коде
  • ПРЕДУПРЕЖДЕНИЕ & события ERROR для непредвиденных вхождений, которые могут привести к сбою запроса (например, сбой проверки подлинности).
  • ИНФОРМАЦИОННЫЙ & события VERBOSE для справки по диагностика, например использование конфигурации модуля

В данном пошаговом руководстве представлены следующие задачи.

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

Предварительные требования

Перед выполнением задач, описанных в этой статье, выполните следующие действия.

Шаг 1. Установка СЛУЖБ IIS

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

  • ASP (в разделе World Wide Web Services => Application Development Features => ASP)
  • ASP.Net (в разделе World Wide Web Services => Application Development Features => ASP.Net)
  • Трассировка (в разделе World Wide Web Services => Health & Diagnostics => Tracing)

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

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

Примечание

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

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

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

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

  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

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

Примечание

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

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

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

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

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

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

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

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

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

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

Содержимое "ЗАГОЛОВКИ ЗАПРОСОВ" & "ЗАГОЛОВКИ ОТВЕТОВ" поступило из нашего модуля, указывая, что работает.

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

Эта задача подключает traceSource модуля к трассировке IIS, чтобы его события выдавали через СЛУЖБЫ IIS, а затем настраивают трассировку неудачных запросов для записи этих событий трассировки.

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

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

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

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

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

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

  5. Скопируйте и вставьте эту <систему. Раздел "Диагностика> " в файл 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 проверка и страницу & модуля проверка. В разделе Детализация выберите Подробный.
    Снимок экрана выбора поставщиков трассировки с выделенным параметром

    Примечание

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

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

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

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

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

Сводка

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

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