HTTP Pipeline
HTTP Pipeline |
HttpContext
– Properties hold references to HttpRequest, HttpResponse, state management objects, etc.
– Current context always available to processing thread via static HttpContext.Current property
Integration with IIS
- Requests dispatched through ISAPI extension, ASPNET_ISAPI.DLL
- ASPNET_ISAPI.DLL passes requests through named pipe to a worker process called ASPNET_WP.EXE
- ASPNET_WP.EXE processes requests using HttpRuntime–based pipeline
- Pipeline can be integrated with other web servers too
Implementing an HTTP handler
• HTTP handlers process request messages and generate response messages
– Handlers are simply classes that implement IHttpHandler interface
– ProcessRequest called when HTTP request targeting handler's URI arrives
– HttpContext argument represents the HTTP request and corresponding response
– Handlers can be instantiated by default factory
– If handler’s IsReusable property is true, handler will be reused
interface IHttpHandler
{
void ProcessRequest(HttpContext ctx);
bool IsReuseable { get; }
}
namespace MyNamespace
{
public class BasicHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
ctx.Response.ContentType = "text/xml";
ctx.Response.Write("
ctx.Response.Write(ctx.Request.ServerVariables["PATH_INFO"]);
ctx.Response.Write("");
}
public bool IsReusable { get { return true; } }
}
}
Deploying an HTTP handler
• Once an HTTP handler is implemented, it must be deployed
– Handler's assembly must be put in target virtual directory'sbin subdirectory or GAC
–
– Entry must be added to virtual directory's IIS script map
HTTP modules
• HTTP handlers allow you to extend the end of the HTTP serverside pipeline. HTTP modules allow you to extend the middle of the pipeline and examine and possibly modify HTTP messages as they pass by.
Implementing an HTTP module
• HTTP modules process events about HTTP request and response message progress through pipeline
– Modules are simply classes that implement IHttpModule
– Modules instantiated and used by HttpApplication objects to process HTTP requests
– Init/Dispose called to connect/disconnect module's handlers to/from HttpApplication object's events
– Specific event handlers added to module as needed
interface IHttpModule
{
void Init(HttpApplication app);
void Dispose();
}
public class MyModule : IHttpModule
{
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest += new EventHandler(this.OnBeginRequest);
}
public void Dispose() {}
// event handlers
public void OnBeginRequest(object o, EventArgs ea)
{
HttpApplication httpApp = (HttpApplication) o;
HttpContext ctx = (HttpContext) ea.ExtendedInfo;
... // write your code here
}
}
Deploying an HTTP module
• Once an HTTP module is implemented, it must be deployed
– Module's assembly must be put in target virtual directory's bin subdirectory or GAC
–
No comments:
Post a Comment