您的位置:首页 > 理论基础 > 计算机网络

ASP.NET 3.5核心编程学习笔记(45):HTTP处理程序之高级编程

2011-04-29 23:17 746 查看
  HTTP处理程序的用户十分明确:改变某类资源的处理方式,并将其返回给用户。我们可以通过处理程序基于运行时条件或某种形式的逻辑对传统资源进行筛选,还可使HTTP处理程序以异步方式来返回特定的页面或资源。

  对于HTTP处理程序来说,注册是一个关键步骤,它为ASP.NET提供有关处理程序的信息。但我们都需要修改应用程序的web.config文件,以便为ASP.NET应用程序提供处理程序的信息。

  通过ASHX扩展和处理程序编程模型,我们可以避免修改web.config。部署新的HTTP处理程序只需要将对应的文件复制到应用程序的某个文件夹下即可。

以ASHX资源的形式处理程序

  ashx文件包含一个特殊的指令@WebHandler,该指令用于表示HTTP处理程序端点与实现它的类之间的关系。所有ashx文件必须以这样的指令开头:

<%@ WebHandler Language="C#" Class="Core35.Components.YourHandler" %>


  若ashx端点被调用,ASP.NET会解析该文件的源代码,并查找@WebHandler指令指示的HTTP处理程序类。这个自动过程消除了更新web.config文件的必要。

  下面给出一个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;
}
}

}


  注意,该类的源代码可以以内联形式编写,也可以从应用程序引用的程序集中加载。

  ASP.NET会特别为ashx资源向IIS元库中添加一个记录,因而不必动手配置Web服务器。

  带有ashx扩展名的资源会由名为SimpleHandleFactory的HTTP处理程序工厂处理。它会查找文件顶部的@WebHandler指令,通过该指令找到HTTP处理程序类。

  为构建HTTP处理程序,我们可以将常规的类文件编译为程序集,也可以利用ashx资源。除ashx资源在首次请求时动态编译外,这两种试没有显著区别。

防止访问被禁的资源

  如果不希望通过Web公开某种Web应用程序管理的资源,则必须通过IIS不返回那些资源文件。为此,可将该资源的请求交给aspnet_isapi,且将相应的扩展名映射到一个内建的处理程序,即HttpForbiddenHandler类:

<add verb="*" path="*.xyz" type="System.Web.HttpForbiddenHandler" />


  这样,任何对.xyz资源的访问都将显示错误消息。这个功能也适用于应用程序中某个具体的资源,如下所示:

<add verb="*" path="yourFile.txt" type="System.Web.HttpForbiddenHandler" />


如何判断是否需要复用HTTP处理程序

  在一般的HTTP处理程序中,ProcessRequest要负责完成所有工作。IHttpHandler接口的IsReusabel属性只应在非常特殊的情况下让其返回true。如果该属性为true,那么在使用该处理程序过后,处理程序不会从内存中卸载,并反复使用。也就是说,该属性用于指示处理程序对象是否能被放入池中。

  在大多数情况下,该属性返回true或false都没有太大影响。如果该属性为false,则要求为每个请求创建新的对象。简单对象的创建不会造成大的系统开销。如果处理程序初始化的代码较高,则应该让IsRusable属性返回true以降低初始化的开销。

  总的来说,除了要在并发环境下处理多个实例属性,或某些属性可能出问题,否则应让IsResuable属性返回true。

  何时使用处理程序的IsResuable属性呢?答案是,仅当使用HTTP处理程序工厂时,该工厂会询问处理程序,看它是否能为多个请求服务,进而选择性的创建和维护处理程序池。

  ASP.NET页面和ASHX资源都由各自的工厂控制创建。然而,这两种工厂都不检查IsReusable属性。在ASP.NET平台内建的处理程序工厂中,很少有检查程序IsReusable属性的。这意味着,在创建AXD、ASHX或ASPX资源的HTTP处理程序时,无需为试图找到最优的IsResuable属性设置浪费时间。

  何时需要使用HTTP处理程序工厂呢?答案是,在不能确定选择哪个HTTP处理程序类的情况下。例如,对于ASPX页面,我们可能无法进一步获该使用哪个类型的HTTP处理程序,该类型可能尚不存在(如果动态编译)。这里就需要HTTP处理程序工厂通过某种逻辑来决定使用哪个处理程序。也就是说,如果只声明端点和类之间的绑定还不够,则需要HTTP处理程序工厂来进一步判定使用哪个HTTP处理程序。

HTTP处理程序工厂

  HTTP请求可以与HTTP处理程序直接关联,也可以与HTTP处理程序工厂对象关联。HTTP处理程序工厂是实现IHttpHandlerFactory接口的类,负责返回实际处理请求的HTTP处理程序。

  在.NET Framework中,HTTP处理程序工厂用于在请求的资源传给处理程序前,对其执行某些准备工作。如PageHandlerFactory负责处理aspx页面,这个处理程序工厂不仅简单返回相应的处理程序,如果需要,它还会从程序集中加载处理程序。

  HTTP处理程序工厂实现了IHttpHandlerFactory的两个方法:GetHandler和ReleaseHandler,见下表:



  下面是一个简单的HTTP处理程序工厂示例,该工厂能够基于不同的HTTP动作(GET或POST)返回请求的处理程序:

class MyHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, String url, String pathTranslated)
{
if(context.Request.RequestType.ToLower() == "get")
return (IHttpHandler)new MyGetHandler();
else if(context.Request.RequestType.ToLower() == "post")
return (IHttpHandler)new MyPostHandler();
return null;
}

public void ReleaseHandler(IHttpHandler handler)
{
// Nothing to do
}
}


  若要使用HTTP处理程序工厂,我们需要通过ASP.NET配置文件进行注册。如果注册某个处理程序,它会一直用于处理相应的请求。如果选择工厂,我们便可以基于运行时条件动态决定哪个处理程序更适合特定的请求。此外,还可以通过处理程序的IsReusable属性来实现处理程序池。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: