Два перехватчика: 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