Два перехватчика: HttpModule и HttpHandlers - Шаги реализации HttpHandlers, HttpModule

ОГЛАВЛЕНИЕ

Шаги реализации HttpHandlers

Шаг 1

HttpHandlers являются классами, реализующими логику предварительной обработки. Поэтому сначала надо создать проект класса и сослаться на пространство имен System.Web и реализовать интерфейс IHttpHandler, как показано во фрагменте кода ниже. Интерфейс IHttpHandler имеет два метода, требующих реализации; один – ProcessRequest, а второй - IsResuable. В методе ProcessRequest URL вводится в файл и отображается в браузере. Был обработан объект ответа контекста, чтобы отправить вывод браузеру.

using System;
using System.Web;
using System.IO;
namespace MyPipeLine
{
public class clsMyHandler : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
context.Response.Write("The page request is " + context.Request.RawUrl.ToString());
StreamWriter sw = new StreamWriter(@"C:\requestLog.txt",true);
sw.WriteLine("Page requested at " + DateTime.Now.ToString() +
            context.Request.RawUrl); sw.Close();
}
public bool IsReusable
{
get
{
return true;
}
}
}

Шаг 2

На шаге 2 надо сделать запись тега HttpHandlers. В теге надо указать, какой вид запрошенного расширения вызовет класс.

<system.web>
<httpHandlers>
<add verb="*" path="*.Shiv,*.Koirala" type="MyPipeLine.clsMyHandler, MyPipeLine"/>
</httpHandlers>
</system.web>

Сделав все, запросите имя страницы с расширением ‘Shiv’ и увидите показанный ниже вывод. Когда IIS видит, что запрос предназначен для расширения страницы ‘.shiv’, он вызывает логику предварительной обработки класса clsMyHandler.

Шаги реализации HttpModule

Шаг 1

Как сказано ранее, HttpModule является препроцессором события. Поэтому сначала надо реализовать IHttpModule и зарегистрировать необходимые события, на которые этот модуль должен подписаться. В примере зарегистрировались в событиях BeginRequest и EndRequest. В этих событиях запись заносится в файл журнала.

public class clsMyModule : IHttpModule
{
public clsMyModule()
{}
public void Init(HttpApplication objApplication)
{
// зарегистрировать обработчик события канала
objApplication.BeginRequest += new EventHandler(this.context_BeginRequest);
objApplication.EndRequest += new EventHandler(this.context_EndRequest);
}
public void Dispose()
{
}
public void context_EndRequest(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter(@"C:\requestLog.txt",true);
sw.WriteLine("End Request called at " + DateTime.Now.ToString()); sw.Close();
}
public void context_BeginRequest(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter(@"C:\requestLog.txt",true);
sw.WriteLine("Begin request called at " + DateTime.Now.ToString()); sw.Close();
}
}

Шаг 2

Надо внести эти записи модуля в тег HttpModule, как показано во фрагменте кода ниже:

<httpModules>
<add name="clsMyModule" type="MyPipeLine.clsMyModule, MyPipeLine"/>
</httpModules>

Итоговый вывод

При выполнении кода в RequestLog.txt должно появиться нечто вроде следующего. Вышеприведенный пример непрактичен, но помогает понять основы.

Begin request called at 11/12/2008 6:32:00 PM
End Request called at 11/12/2008 6:32:00 PM
Begin request called at 11/12/2008 6:32:03 PM
End Request called at 11/12/2008 6:32:03 PM
Begin request called at 11/12/2008 6:32:06 PM
End Request called at 11/12/2008 6:32:06 PM
Begin request called at 11/12/2008 8:36:04 PM
End Request called at 11/12/2008 8:36:04 PM
Begin request called at 11/12/2008 8:37:06 PM
End Request called at 11/12/2008 8:37:06 PM
Begin request called at 11/12/2008 8:37:09 PM
End Request called at 11/12/2008 8:37:09 PM
Begin request called at 11/12/2008 8:37:38 PM
Page requested at 11/12/2008 8:37:38 PM/WebSiteHandlerDemo/Articles.shiv
End Request called at 11/12/2008 8:37:38 PM