ASP.NET Tutorial/Development/HTTP Modules

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

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>