Добавление трассировки в управляемые модули IIS 7.0
Введение
В 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. Создание резервной копии
Создайте резервную копию конфигурации перед выполнением задач, описанных в этой статье. Выполните следующую команду:
Нажмите кнопку Пуск —> Все программы —> Стандартные —> (r-щелчок)Командная строка —> запуск от имени администратора
Выполните следующую команду в этой командной строке:
%windir%\system32\inetsrv\appcmd add backup
Шаг 4. Создание примера содержимого
- Удалите все содержимое папки
c:\inetpub\wwwroot
. - В командной строке администратора, запущенной выше, вставьте вложенный код в файл 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. Добавление модуля в конфигурацию сайта
- С помощью той же командной строки администратора создайте каталог с именем \inetpub\wwwroot\bin, а затем скопируйте IIS_MOD_REQDATA.dll в этот каталог.
- Включите модуль. В командной строке администратора введите start inetmgr , чтобы открыть пользовательский интерфейс администрирования IIS.
- В области Подключения разверните имя локального компьютера, а затем — Сайты и щелкните Веб-сайт по умолчанию.
- В разделе IIS в центральной области дважды щелкните модули:
- Вы увидите большой список модулей, настроенных для использования этим сайтом. В правой части пользовательского интерфейса в разделе Действия щелкните Добавить управляемый модуль:
- В отображаемом окне назовите управляемый модуль IIS_MOD_REQDATA , а тип модуля — IIS_MOD_REQDATA. IIS_MOD_REQDATA(выберите это в раскрывающемся списке):
- Нажмите кнопку ОК. Новый модуль трассировки теперь настроен для использования веб-сайтом.
Шаг 2. Тестирование модуля
Протестируйте модуль, открыв интернет-Обозреватель и перейдя в .http://localhost/test.htm
Появится следующее окно:
Содержимое "ЗАГОЛОВКИ ЗАПРОСОВ" & "ЗАГОЛОВКИ ОТВЕТОВ" поступило из нашего модуля, указывая, что работает.
Маршрутизация событий в IIS
Эта задача подключает traceSource модуля к трассировке IIS, чтобы его события выдавали через СЛУЖБЫ IIS, а затем настраивают трассировку неудачных запросов для записи этих событий трассировки.
Шаг 1. Включение модуля TraceSource & маршрутизации событий в IIS
Модуль обновлен для включения событий трассировки. Настройте System.Diagnostics и IIS для записи этих событий трассировки и их маршрутизации в модуль трассировки неудачных запросов IIS. Для этого настройте <раздел system.диагностика> в файле web.config, чтобы настроить TraceSource & маршрутизировать события соответствующим образом.
В командной строке администратора перейдите по адресу
c:\inetpub\wwwroot
и используйте Блокнот для редактирования файла web.config.Существует 3 части конфигурации, которые необходимо выполнить, чтобы получить события, создаваемые модулем для маршрутизации в инфраструктуру трассировки IIS:
- Определение traceListener события IIS в качестве общего прослушивателя
- Определение переключателя для включения всех событий
- Определение источника трассировки, присоединение определенного параметра, а также определение прослушивателя трассировки для источника.
IIS поставляет новый system.Diagnostics.TraceListener, используемый для маршрутизации событий TraceSource в инфраструктуру трассировки IIS. Этот поставщик также должен быть определен в файле web.config.
Определите traceSource по имени (tsStatus) и подключите его к defaultSwitch & IisTraceListener.
Скопируйте и вставьте эту <систему. Раздел "Диагностика> " в файл 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. Чтобы настроить трассировку неудачных запросов, выполните указанные ниже действия.
В командной строке администратора введите start inetmgr. На панели Подключения разверните имя компьютера, затем папку Сайты, а затем щелкните Веб-сайт по умолчанию. Справа под панелью Действия щелкните ссылку Трассировка неудачных запросов... в разделе Настройка:
Установите флажок Включить проверка. Сохраните значения по умолчанию для других параметров. Чтобы продолжить, нажмите кнопку ОК .
Теперь, когда мы убедились, что ведение журнала трассировки неудачных запросов включено, необходимо настроить определения сбоев. Вернитесь в диспетчер IIS и в разделе IIS дважды щелкните правила трассировки неудачных запросов.
В области Действия нажмите кнопку Добавить. Откроется мастер добавления правила трассировки неудачных запросов .
На странице Укажите содержимое для трассировки выберите параметр Все содержимое (*) для трассировки. Щелкните Далее.
На экране Определение условий трассировки проверка поле Коды состояния проверка & введите "200" в качестве кода состояния для трассировки.
Щелкните Далее. Откроется страница Выбор поставщиков трассировки . В разделе "Области" выберите поле ASPNET проверка и страницу & модуля проверка. В разделе Детализация выберите Подробный.
Примечание
Из-за ошибки в сборках серверной бета-версии 3 трассировки модулей можно записать только в том случае, если выбраны области Модуль и Страница. Для сбора этих событий после бета-версии сервера 3 требуется только модуль.
Нажмите кнопку Готово. Вы увидите следующее определение для веб-сайта по умолчанию:
Тестирование и просмотр результатов
В этой задаче мы создадим неудачный запрос и просмотрим результирующий журнал трассировки. Помните, что мы настроили СЛУЖБЫ IIS для записи журналов трассировки для http://localhost/* запросов, которые завершаются ошибкой 200. Чтобы убедиться, что он сработал, выполните следующее.
- Откройте новое окно интернет-Обозреватель. Введите адрес
http://localhost/test.htm
. Опять же, вы увидите следующее:
- Чтобы убедиться, что модуль создал трассировки, которые были записаны, в окне интернет-Обозреватель с повышенными правами администратора нажмите клавиши CTRL+O, а затем перейдите к
c:\inetpub\logs\FailedReqLogFiles\W3SVC1
. В раскрывающемся списке с текстом HTML-файлов выберите Все файлы. - Выберите последний файл fr#####.xml (текущая дата) и нажмите кнопку Открыть. Вы увидите события:
Сводка
Вы добавили новое событие трассировки в управляемый модуль, скомпилировали и развернули этот модуль, настроили System.Diagnostics для маршрутизации событий в инфраструктуру трассировки IIS и, наконец, настроили функцию трассировки неудачных запросов IIS для записи событий. Теперь можно легко добавлять новые события в модуль, а затем перекомпилировать модуль & развернуть его в каталоге \bin. При использовании трассировки неудачных запросов вы увидите результаты событий.
Помните, что использование System.Diagnostics.TraceSource позволяет по-прежнему использовать модуль и его события трассировки на нижнем уровне при условии, что вы подключите его к другому прослушивателю трассировки.