ASP.NET Tutorial/Development/HTTP Modules
Содержание
- 1 Adding the HttpHandler configuration information to web.config
- 2 Creating Custom HTTP Modules
- 3 HttpContext (C#)
- 4 HttpContext (VB)
- 5 HttpModule Tester
- 6 Outputting an image from an HttpHandler (C#)
- 7 Outputting an image from an HttpHandler (VB)
- 8 The IHttpHandler page template (C#)
- 9 The IHttpHandler page template (VB)
- 10 URL rewriting HttpModule (C#)
- 11 URL rewriting HttpModule (VB)
Adding the HttpHandler configuration information to web.config
<source lang="csharp">
using System; using System.Web; public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) { context.Response.ContentType = "image/jpeg"; context.Response.WriteFile("Sunset.jpg"); } public bool IsReusable { get { return false; } }
}</source>
Creating Custom HTTP Modules
<source lang="csharp">
An HTTP Module is a .NET class that executes with each and every page request. The HTTP Module doesn"t allow you to request a page unless you include the proper query string with the request. File: App_Code\QueryStringAuthenticationModule.cs using System; using System.Web; namespace MyNamespace {
public class QueryStringAuthenticationModule : IHttpModule { public void Init(HttpApplication app) { app.AuthorizeRequest += new EventHandler(AuthorizeRequest); } private void AuthorizeRequest(Object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; HttpContext context = app.Context; string path = context.Request.AppRelativeCurrentExecutionFilePath; if (String.rupare(path, "~/login.aspx", true) == 0) return; bool authenticated = false; if (context.Request.QueryString["password"] != null) { if (context.Request.QueryString["password"] == "secret") authenticated = true; } if (!authenticated) context.Response.Redirect("~/Login.aspx"); } public void Dispose() { } }
}
Register the HTTP Module in the web configuration file. File: Web.Config <configuration>
<system.web> <httpModules> <add name="QueryStringAuthenticationModule" type="MyNamespace.QueryStringAuthenticationModule"/> </httpModules> </system.web>
</configuration></source>
HttpContext (C#)
<source lang="csharp">
using System; using System.Collections.Generic; using System.Text; using System.Web; namespace Demo {
public class AppendMessage : IHttpModule { private HttpContext _current = null; #region IHttpModule Members public void Dispose() { throw new Exception("The method or operation is not implemented."); } public void Init(System.Web.HttpApplication context) { _current = context.Context; context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent); } void context_PreSendRequestContent(object sender, EventArgs e) { string message = ""; _current.Response.Output.Write(message); } #endregion }
} File: Web.config
<configuration>
<system.web> <httpModules> <add name="AppendMessage" type="AppendMessage, App_code" /> </httpModules> </system.web>
</configuration></source>
HttpContext (VB)
<source lang="csharp">
Imports Microsoft.VisualBasic Imports System.Web Public Class AppendMessage
Implements IHttpModule Dim WithEvents _application As HttpApplication = Nothing Public Overridable Sub Init(ByVal context As HttpApplication) _ Implements IHttpModule.Init _application = context End Sub Public Overridable Sub Dispose() Implements IHttpModule.Dispose End Sub Public Sub context_PreSendRequestContent(ByVal sender As Object, _ ByVal e As EventArgs) Handles _application.PreSendRequestContent Dim message As String = "" _application.Context.Response.Output.Write(message) End Sub
End Class File: Web.config
<configuration>
<system.web> <httpModules> <add name="AppendMessage" type="AppendMessage, App_code" /> </httpModules> </system.web>
</configuration></source>
HttpModule Tester
<source lang="csharp">
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="HttpModuleTester" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">
<title>HttpModuleTester</title>
</head> <body>
<form id="form1" runat="server">
</form>
</body> </html> File: Default.aspx.cs using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class HttpModuleTester : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) { HttpContext myHttpContext = HttpContext.Current; HttpApplication myHttpApplication = myHttpContext.ApplicationInstance; HttpModuleCollection myHttpModuleCollection = myHttpApplication.Modules; for (int index=0; index < myHttpModuleCollection.Count; index++) { IHttpModule module = myHttpModuleCollection.Get(index); Response.Write("Module = " + module.ToString() + "
"); } string httpModuleName = myHttpModuleCollection.GetKey(1); Response.Write("The name of the HttpModule object at index 1" + " is " + """ + httpModuleName + ""." + "
"); string[] allModules = myHttpModuleCollection.AllKeys; Response.Write("The HttpModule objects contained in the HttpModuleCollection are:
"); for (int i = 0; i < allModules.Length; i++) Response.Write("Module " + i + " : " + allModules[i] + "
"); }
}</source>
Outputting an image from an HttpHandler (C#)
<source lang="csharp">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">
<title>HttpHandler Serving an Image</title>
</head> <body>
<form id="form1" runat="server">
<img src="ImageHandler.ashx" />
</form>
</body> </html> File: Handler.ashx
<%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) { context.Response.ContentType = "image/jpeg" context.Response.WriteFile("Sunset.jpg") } public bool IsReusable { get { return false; } }
}</source>
Outputting an image from an HttpHandler (VB)
<source lang="csharp">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">
<title>HttpHandler Serving an Image</title>
</head> <body>
<form id="form1" runat="server">
<img src="ImageHandler.ashx" />
</form>
</body> </html> File: Handler.ashx <%@ WebHandler Language="VB" Class="Handler" %> Imports System Imports System.Web Public Class Handler : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest context.Response.ContentType = "image/jpeg" context.Response.WriteFile("Sunset.jpg") End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property
End Class</source>
The IHttpHandler page template (C#)
<source lang="csharp">
File: Handler.ashx <%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } public bool IsReusable { get { return false; } }
}</source>
The IHttpHandler page template (VB)
<source lang="csharp">
File: Handler.ashx <%@ WebHandler Language="VB" Class="Handler" %> Imports System Imports System.Web Public Class Handler : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest context.Response.ContentType = "text/plain" context.Response.Write("Hello World") End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property
End Class</source>
URL rewriting HttpModule (C#)
<source lang="csharp">
using System.Web; public class SimpleRewriter : System.Web.IHttpModule {
HttpApplication _application = null; public void Init(HttpApplication context) { context.BeginRequest += new System.EventHandler(context_BeginRequest); _application = context; } public void Dispose() { } private void context_BeginRequest(object sender, System.EventArgs e) { string requesturl = _application.Context.Request.Path.Substring(0, _application.Context.Request.Path.LastIndexOf("//") ); string[] parameters = requesturl.Split(new char[] { "/" }); if (parameters.Length > 1) { string firstname = parameters[1]; string lastname = parameters[2]; _application.Context.RewritePath("~/unfriendly.aspx?firstname=" + firstname + "&lastname=" + lastname); } }
}</source>
URL rewriting HttpModule (VB)
<source lang="csharp">
Imports Microsoft.VisualBasic Imports System.Web Public Class SimpleRewriter
Implements System.Web.IHttpModule Dim WithEvents _application As HttpApplication = Nothing Public Overridable Sub Init(ByVal context As HttpApplication) _ Implements IHttpModule.Init _application = context End Sub Public Overridable Sub Dispose() Implements IHttpModule.Dispose End Sub Public Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) _ Handles _application.BeginRequest Dim requesturl As String = _ _application.Context.Request.Path.Substring(0, _ _application.Context.Request.Path.LastIndexOf("/"c)) Dim parameters() As String = _ requesturl.Split(New [Char]() {"/"c}, _ StringSplitOptions.RemoveEmptyEntries) If (parameters.Length > 1) Then Dim firstname As String = parameters(1) Dim lastname As String = parameters(2) _application.Context.RewritePath("~/unfriendly.aspx?firstname=" & _ firstname & "&lastname=" & lastname) End If End Sub
End Class</source>