HTTP MOdules and HTTP Handlers
http://www.codeproject.com/Articles/30907/The-Two-Interceptors-HttpModule-and-HttpHandlers
Introduction
Many times we want to implement pre-processing logic before a request hits the IIS resources. For instance you would like to apply security mechanism, URL rewriting, filter something in the request, etc. ASP.NET has provided two types of interceptionHttpModule and HttpHandler. This article walks through it.The Problem
Many times we need to inject some kind of logic before the page is requested. Some of the commonly used pre-processing logics are stat counters, URL rewriting, authentication / authorization and many more. We can do this in the code behind but then that can lead to lot of complication and tangled code. The code behind will not solve the purpose because in some implementations like authorization, we want the logic to execute before it reaches the resource. ASP.NET provides two ways of injecting logic in the request pipelineHttpHandlers and HttpModules.HttpHandler - The Extension Based Preprocessor
HttpHandler help us to inject pre-processing logic based on the extension of the file name requested. So when a page is requested, HttpHandler
executes on the base of extension file names and on the base of verbs.
For instance, you can visualize from the figure below how we have
different handlers mapped to file extension. We can also map one handler
to multiple file extensions. For instance, when any client requests for
file with extension ‘GIF’ and ‘JPEG’, handler3 pre-processing logic executes.HttpModule - The Event Based Preprocessor
HttpModule is an
event based methodology to inject pre-processing logic before any
resource is requested. When any client sends a request for a resource,
the request pipeline emits a lot of events as shown in the figure below:
BeginRequest: Request has been started. If you need to do something at the beginning of a request (for example, display advertisement banners at the top of each page), synchronize this event.AuthenticateRequest: If you want to plug in your own custom authentication scheme (for example, look up a user against a database to validate the password), build a module that synchronizes this event and authenticates the user in a way that you want to.AuthorizeRequest: This event is used internally to implement authorization mechanisms (for example, to store your access control lists (ACLs) in a database rather than in the file system). Although you can override this event, there are not many good reasons to do so.PreRequestHandlerExecute: This event occurs before the HTTP handler is executed.PostRequestHandlerExecute: This event occurs after the HTTP handler is executed.EndRequest: Request has been completed. You may want to build a debugging module that gathers information throughout the request and then writes the information to the page.
HttpModules. So when the request pipe line executes depending on the event registered, the logic from the modules is processed.The Overall Picture of Handler and Modules
Now that we have gone through the basics, let's understand what is the Microsoft definition for handler and modules to get the overall picture.Reference: INFO: ASP.NET HTTP Modules and HTTP Handlers Overview
“Modules are called before and after the handler executes. Modules enable developers to intercept, participate in, or modify each individual request. Handlers are used to process individual endpoint requests. Handlers enable the ASP.NET Framework to process individual HTTP URLs or groups of URL extensions within an application. Unlike modules, only one handler is used to process a request”.
Steps to Implement HttpHandlers
Step 1
HttpHandlers are nothing but classes which have
pre-processing logic implemented. So the first thing is to create a
class project and reference System.Web namespace and implement the IHttpHandler interface as shown in the below code snippet. IHttpHandler interface has two methods which needs to be implemented; one is the ProcessRequest and the other is the IsResuable. In the ProcessRequest
method, we are just entering the URL into the file and displaying the
same into the browser. We have manipulated the context response object
to send the display to the browser.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;
}
}
}
Step 2
In step 2, we need to make an entry ofHttpHandlers tag. In the tag, we need to specify which kind of extension requested will invoke our class. <system.web>
<httpHandlers>
<add verb="*" path="*.Shiv,*.Koirala" type="MyPipeLine.clsMyHandler, MyPipeLine"/>
</httpHandlers>
</system.web>
Once done, request for page name with extension ‘Shiv’ and you should
see a display as shown below. So what has happened is when the IIS sees
that request is for a ‘.shiv’ page extension, it just calls the clsMyHandler class pre-processing logic.Steps to Implement HttpModule
Step 1
As discussed previously,HttpModule is an event pre-processor. So the first thing is to implement the IHttpModule and register the necessary events which this module should subscribe. For instance, we have registered in this sample for BeginRequest and EndRequest events. In those events, we have just written an entry on to the log file.The Init function below registers event handlers for two HttpApplication events, BeginRequest and EndRequest.public class clsMyModule : IHttpModule
{
public clsMyModule()
{}
public void Init(HttpApplication objApplication)
{
// Register event handler of the pipe lineobjApplication.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();
}
}
Step 2
We need to enter those module entries into theHttpModule tag as shown in the below code snippet:<httpModules>
<add name="clsMyModule" type="MyPipeLine.clsMyModule, MyPipeLine"/>
</httpModules>
The Final Output
If you run the code, you should see something like this in the RequestLog.txt. The above example is not so practical. But it will help us understand the fundamentals.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
Difference between HTTP Modules and HTTp handlers
An HTTP module is an assembly that is called on every request that is made to your application. HTTP modules are called as part of the ASP.NET request pipeline and have access to life-cycle events throughout the request. HTTP modules let you examine incoming and outgoing requests and take action based on the request.Typical uses for HTTP modules include the following:
-
Security Because you can examine incoming requests, an
HTTP module can perform custom authentication or other security checks
before the requested page, XML Web service, or handler is called. In
Internet Information Services (IIS) 7.0 running
in Integrated mode, you can extend forms authentication to all content
types in an application.
-
Statistics and logging Because HTTP modules are called
on every request, you can gather request statistics and log information
in a centralized module, instead of in individual pages.
-
Custom headers or footers Because you can modify the
outgoing response, you can insert content such as custom header
information into every page or XML Web service response.
An ASP.NET HTTP handler is the process (frequently referred to as the "endpoint") that runs in response to a request made to an ASP.NET Web application. The most common handler is an ASP.NET page handler that processes .aspx files. When users request an .aspx file, the request is processed by the page through the page handler. You can create your own HTTP handlers that render custom output to the browser.
Typical uses for custom HTTP handlers include the following:
-
RSS feeds To create an RSS feed for a Web site, you
can create a handler that emits RSS-formatted XML. You can then bind a
file name extension such as .rss to the custom handler. When users send a
request to your site that ends in .rss, ASP.NET
calls your handler to process the request.
-
Image server If you want a Web application to serve
images in a variety of sizes, you can write a custom handler to resize
images and then send them to the user as the handler's response.
1, HTTPModule:
It's just like a filter. The Modules are called before and after the handler executes.
For example: BeginRequest, AuthenticationRequest event, EndRequest event etc. You may intercept , participate and modify each request.
Modules implement the IHttpMudule interface located in the System.Web.System.
2, HTTPHandler:
You may think it as a program.(or handler, or module), it execute some code when the user send some request. An .aspx page can be thought as a HTTPHandler too, which implements more functions.
No comments:
Post a Comment