创建自定义 HTTP 处理程序

* HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构的组成部分。在对一个请求进行处理时,由多个 HTTP 模块
    (例如,身份验证模块和会话模块)处理每个请求,然后再由单个 HTTP 处理程序来处理。处理程序处理请求之后,
    该请求再通过 HTTP 模块流转回来。
 
 * HTTP 处理程序:
    处理程序用于处理各个终结点请求。处理程序使 ASP.NET 框架可以处理应用程序内的单个 HTTP URL 或成组
    的 URL 扩展。与模块不同,只有一个处理程序用于处理请求。所有处理程序均实现 IHttpHandler 接口,该
    接口位于 System.Web 名称空间中。处理程序在某些方面与 Internet 服务器应用程序编程接口 (ISAPI) 扩展类似。


 * HttpHandles:根据请求中指定的 URL (资源的位置(Path)) 和 HTTP 谓词(Verb)将传入的请求映射到相应的处理程序。可以在配置层次中的
    任何级别声明此元素。
 *
 * HttpHandler实现了ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功
   能的实现通过实现IHttpHandler接口来达到。
 *
 * ASP.NET 收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。

 * IHttpHandler:定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
    IHttpHandler公共属性:
        IsReusable: 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。如果 IHttpHandler 实例可
        再次使用,则为 true;否则为 false。
    IHttpHandler公共方法:
        ProcessRequest:通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
 *
 * 创建 HTTP 处理程序
    要创建 HTTP 处理程序,您必须实现 IHttpHandler 接口。IHttpHandler 接口具有一种方法和一种属性,并带有
    下列签名:
    void ProcessRequest(HttpContext);
    bool IsReusable {get;}
    注意:如果 HTTP 处理程序中需要会话状态,还需要实现 IRequiresSessionState 接口。
 
 *
 * HttpApplication:定义 ASP.NET 应用程序中的所有应用程序对象通用的方法、属性和事件。
   此类是用户在 global.asax 文件中所定义的应用程序的基类。
 *
 * <httpHandlers> 设置由应用程序子目录继承。
 * <add> 指令按由上而下的顺序进行处理。如果两个或多个 <add> 元素指定相同的谓词/路径组合,
 * 则最后一个 <add> 会重写其他所有元素。

 * Microsoft Internet 信息服务 (IIS) 有自己的 ISAPI 映射扩展模型。为使给定应用程序扩展与其处理程序之间的
 * 映射生效,该扩展必须在 IIS 中映射为 ASP.NET ISAPI。对于自定义扩展等非标准扩展,则必须相应地配置 IIS。
 
 * 配置 HTTP 处理程序:
    <httpHandlers> 配置节处理程序负责将传入的 URL 映射到 IHttpHandler 或 IHttpHandlerFactory 类。它可以在
    计算机、站点或应用程序级别声明。子目录将继承这些设置。
    管理员使用 <add> 标记指令配置 <httpHandlers> 节。<Add> 指令是按从上到下的顺序进行解释和处理的。对于
     <httpHandler> 节处理程序,请使用以下语法:
     <httpHandlers>
        <add verb="[verb list]" path="[path/wildcard]" type="[COM+ Class], [Assembly]" validate="[true/false]" />
        <remove verb="[verb list]" path="[path/wildcard]" />
        <clear />
     </httpHandlers>

 Web.config配置:
 下面的示例演示如何执行以下操作:
   将文件扩展名为 .New 的文件的所有 HTTP 请求映射到类 MyHandler.New
   将文件扩展名为 .MyNewFileExtension 的文件的 HTTP GET 和 HEAD 请求映射到类 MyHandler.MNFEHandler.
   两个类都位于 MyHandler.dll 文件中的程序集 MyHandler 中。
   <httpHandlers>
         <add verb="*" path="*.New" type="MyHandler.New,MyHandler"/>
         <add verb="GET,HEAD" path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll"/>
   </httpHandlers>
 *
 --------------------------------------------------------------------------------------------------------
 * 假设写好了一个http处理程序,如何让他发挥作用呢?譬如,需要禁止asp.net下载.info文件,应该进行如下处理:
   第一步,在web服务器上增加指示,让asp.net处理此扩展名。具体为:
    打开IIS(假设web服务器是IIS),找到应用程序,配置,应用程序映射,添加映射,在可执行文件中输入当前.net版
    本的aspnet_isapi.dll(如C:\WINNT\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll),扩展名输入.info,
    谓词全部,检查文件是否存在。经过这些步骤,确保IIS不会自作多情处理.info文件,而让给aspnet_isapi.dll处理,
    后者则会将请求交给asp.net进行处理。
   第二步,在machine.config或者web.config中加入相映配置节。都是在<System.Web〉中的加入<httphandler>子节,
    按照格式指定,譬如:
    <httphandlers>
        …
        <add verb="*" path="*.info" type="System.Web.HttpForbiddenHandler"/>
        …
    </httphandlers>
    经过上述节配置,.info文件会被保护起来,任何企图访问都会被告知“无法提供此类型的页。”;如果换成自己的
    类,则被asp.net框架所调用来处理.info请求。
 *
 *
 --------------------------------------------------------------------------------------------------------
 *
先了解一下IIS系统。它是一个程序,负责对网站的内容进行管理并且处理对客户的请求做出反应。当用户对一个页面
提出请求时,IIS做如下反应(不考虑权限问题):
1.把对方请求的虚拟路径转换成物理路径
2.根据物理路径搜索请求的文件
3.找到文件后,获取文件的内容
4.生成Http头信息。
5.向客户端发送所有的文件内容:首先是头信息,然后是Html内容,最后是其它文件的内容(如图片、JS等)。
6.客户端IE浏览器获得信息后,解析文件内容,找出其中的引用文件,如.js .css .gif等,向IIS请求这些文件。
7.IIS获取请求后,发送文件内容。
8.当浏览器获取所有内容后,生成内容界面,客户就看到图像/文本/其它内容了。

HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些
事件是按先后顺序列出的:
 * • BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步
 *      此事件。
 * • AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构
 *      建一个模块以同步此事件并按您需要的方式验证用户身份。
 * • AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件
 *      系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
 * • ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,
 *      构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
 * • AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的
 *      状态存储中抓取会话状态。
 * • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
 * • PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
 * • ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您
 *      的状态重新存储在状态存储中。
 * • UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入
 *      缓存中。
 * • EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入
 *      页面中。对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。
 * • PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
 * • PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定
 *      义模块同步此事件。
 * • Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。

 

以下为示例:

 

 public class Sample1HttpHandles:IHttpHandler
    {
        public Sample1HttpHandles()
        {
        }

        public void ProcessRequest(HttpContext context)
        {
            //string url = context.Request.QueryString["u"];
            //context.Response.Redirect(url);
            //context.Response.End();
            context.Response.Write("<H1>This is an HttpHandler Test.</H1>");
            context.Response.Write("<p>Your Browser:</p>");
            context.Response.Write("Type: " + context.Request.Browser.Type + "<br>");
            context.Response.Write("Version: " + context.Request.Browser.Version);

        }

        public bool IsReusable
        {
            get { return true; }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值