HTTP 处理器介绍

ASP.NET HTTP 处理器就是运行在请求 ASP.NET Web 应用程序时在回应中所产生的进程(经常被称作[终端点])。最普通的一种处理器就是处理 .aspx 文件的 ASP.NET 页面处理器。当用户请求一个 .aspx 文件的时候,请求就会由该页面通过页面处理器而被处理。

ASP.NET 页面处理器仅仅只是处理器中的其中一种。ASP.NET 还提供了若干其他种类的内建处理器(比如 .asmx 文件的 Web 服务处理器)。

在你需要识别应用程序中不同的文件扩展名并且进行特殊处理的时候就可以创建自定义的 HTTP 处理器。例如,下列情况就适合于使用自定义的 HTTP 处理器:

  • RSS Feed

    如果要创建网站的 RSS Feed,你就需要创建一个处理器来发射格式化的 XML。然后你可以把拥有特定扩展名(比如 .rss)的文件绑定到应用程序中的自定义处理器。在用户向你的网站发送以 .rss 作为结尾部分的请求时,ASP.NET 就会调用你的处理器来处理该请求。

  • 图片服务器

    如果你需要你的 Web 应用程序提供若干尺寸的图片,那么你就可以编写一个自定义的处理器来改变图片的大小然后把它们作为处理器的回应而返回给用户。

HTTP 处理器能够访问应用程序环境,包括用户的身份请求(如果已知)、应用程序状态,和会话信息。在 HTTP 处理器被请求的时候,ASP.NET 还会调用适当处理器的 ProcessRequest 方法。该处理器的 ProcessRequest 方法会创建一个回应,从而会返回到发送请求的浏览器。与任何页面请求一样,回应能够到达任何已经订阅了处理器运行之后所产生的事件的 HTTP 模块。关于处理 Web 服务器请求的更多信息,请参考:[ASP.NET 应用程序生命周期概览]。

HTTP 处理器既能够同步化也能够异步化。一个同步的处理器并不会被返回,直到它已经完成被调用 HTTP 请求的处理之前。而一个异步的处理器则会运行一个不受约束的进程(发送回应给用户)。异步处理器在你需要启动可能比较冗长的应用程序进程的时候是有用的,并且用户不需要进行等待,直接它完成了从服务器获取回应之前。

ASP.NET 中内建的 HTTP 处理器

ASP.NET 基于文件的扩展名来把 HTTP 请求映射到 HTTP 处理器。每种 HTTP 处理器都能够对应用程序中单独的 HTTP URL 或者 URL 扩展的分组进行处理。另外,ASP.NET 还包括了若干内部 HTTP 处理器,如下表所示。

处理器描述
ASP.NET 页面处理器(*.aspx)所有 ASP.NET 页面的默认 HTTP 处理器。
Web 服务处理器(*.asmx)使用 ASP.NET 所创建的 Web 服务页面的默认 HTTP 处理器。
ASP.NET 用户控件处理器(*.ascx)所有 ASP.NET 用户控件页面的默认 HTTP 处理器。
追踪处理器(Trace.axd)一种显示当前页面追踪信息的处理器。关于详细内容,请参考:[实践:使用追踪查看器来查看 ASP.NET 追踪信息]。
创建自定义 HTTP 处理器

如果要创建自定义的 HTTP 处理器,你就需要创建一个实现了 IHttpHandler 接口的类来创建同步处理器或者创建一个实现了 IHttpAsyncHandler 接口的类来创建异步处理器。这两种处理器接口都需要你实现 IsReusable 属性和 ProcessRequest 方法。IsReusable 属性指定了 IHttpHandlerFactory 对象(实际上该对象会对适当的处理器进行调用)是否能够把你的处理器替换进对象池并且对它们进行重用来增加性能,或者它是否在每次需要处理器的时候都必须创建新的实例。另外,ProcessRequest 方法还负责单独 HTTP 请求的实际处理。

创建文件扩展名

在你创建一个类文件来作为你的 HTTP 处理器的时候,你可以让你的处理器对任何没有在 IIS 和 ASP.NET 中被映射的文件名扩展名进行回应。例如,如果你创建了一个用于产生 RSS Feed 的 HTTP 处理器,那么你就可以把你的处理器映射到扩展名 .rss。如果要让 ASP.NET 知道哪种处理器才是用于你的自定义文件扩展名的,那么处理器的类文件的扩展名就必须从 IIS 中映射到 ASP.NET,然后从你的应用程序到你的自定义处理器。

默认时,ASP.NET 会把文件扩展名 .ashx 映射到自定义的 HTTP 处理器,并且以相同的方式把 .aspx 扩展名映射到 ASP.NET 页面处理器。因此,如果你使用文件扩展名 .ashx 创建了一个 HTTP 处理器类,那么处理器就会使用 IIS 和 ASP.NET 而被自动注册。

如果你需要为你的处理器创建一种自定义的文件扩展名,那么你必须明确地使用 IIS 和 ASP.NET 来注册扩展名。不使用 .ashx 文件扩展名的优势就是你的处理器能够重用于不同的扩展名映射。例如,在一个应用程序中你的自定义处理器可能会对以 .rss 作为结尾部分的请求而产生回应,而在另一个应用程序中它可能会对以 .feed 作为结尾部分的请求而产生回应。作为另外一个范例,你的处理器还有可能同时被映射成相同应用程序中的这两种文件扩展名,但是可能会基于扩展名而创建不同的回应。

异步 HTTP 处理器

异步 HTTP 处理器允许你启动一个外部进程(比如一种对于远程服务器的方法调用),然后能够在无需等待外部进程被完成的情况下能够继续处理器本身的处理。在异步 HTTP 处理器的处理期间,ASP.NET 会把平常用于外部进程的线程返回到线程池中,直到处理器从外部进程中接收到一个回调为止。这样做能够防止线程的阻塞并且能够大幅度地改善性能,因为在同一时间内只有为数不多的线程才能够被执行。如果许多用户请求了依赖于外部进程的同步 HTTP 处理器,那么操作系统就能够脱离线程而得到高速运行,这是因为许多线程都已经被阻塞并且在等待外部进程的结束。

在你创建异步处理器的时候,除了实现 IHttpAsyncHandler 接口之外,你还必须实现 BeginProcessRequest 来为单独 HTTP 请求的处理而初始化异步调用。另外,你同样必须实现 EndProcessRequest 方法来运行处理结束时的清理代码。

自定义 IHttpHandlerFactory 类

IHttpHandlerFactory 类获取请求并且负责把请求推送到适当的 HTTP 处理器。你可以通过创建一个实现了 IHttpHandlerFactory 接口的类来创建自定义 HTTP 处理器工厂。创建自定义处理器工厂能够基于运行时条件而创建不同的处理器来允许优秀的控件越过 HTTP 请求的处理。例如,使用自定义 HTTP 处理器工厂,你就可以为一种文件类型而例示 HTTP 处理器,如果 HTTP 请求方法是 PUT 或者是 GET 的话。

转载于:https://www.cnblogs.com/Laeb/archive/2007/03/14/674352.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值