HTTP处理程序

       在谈论HTTP处理程序之前先了解下Web服务器。

       Web服务器是一个服务器应用程序,可以使用大量Internet协议,如HTTP,FTP,SMTP等等与之通信。IIS(windows操作系统自带的Web服务器)。

       Web服务器通常还提供一个应用程序编程接口(API),来增强和自定义服务器功能。第一个扩展API是公共网关接口(Common Gateway Interface,CGI),CGI模块是Web服务器上用来服务一个请求的新型应用程序。它要求每一个新的进程来服务处理每个HTTP请求。这个会出现严重的可扩展性问题。在IIS中已经用ISAPI接口来代替CGI模型。

 

ISAPI模型

  使用ISAPI模型时,IIS不是为每一个请求启动一个新进程,而是把一个ISAPI组件(Win32 DLL)加载到自己进程中。接着,它调用该DLL上一个入口点来服务请求。ISAPI组件在IIS关闭前一直装载在它的进程里,并且可以进一步服务请求,而不会对web服务器产生任何影响。

  ISAPI扩展通过一个URL调用,该URL以实现功能的DLL的名称结尾。例如

http://www.contoso.com/as/hello.dll

该DLL必须导出两个函数:GetExtensionVersion和HttpExtensionProc。GetExtensionVersion函数设置ISAPI服务器扩展版本和名称,而且只被调用一次,并且可用来初始化任何必须的变量。如果一切正常,则该函数返回true.反之为false,而Web服务器停止装载该DLL。HttpExtensionProc函数接受与请求有关的基本HTTP信息,执行设定的操作,并准备将响应发回到浏览器

 

ISAPI筛选器

  它是在服务器处理特定的服务器之前截获这些事件的组件。该筛选器在装载时指示它将处理的事件通知。如果这些事件中任何一个事件发生了,该筛选器就会进行处理,或者把它传递给其他筛选器。

  我们可以使用ISAPI筛选器提供自定义的身份验证技术,或者根据客户端发送的HTTP头自动重定向请求。

 

编写HTTP处理程序

  ASP.NET有几个内置的HTTP处理程序。有一个处理程序服务于ASP.NET页面,一个服务于.NET Web服务,还有一个为IIS托管的远程对象解决.NET Remoting请求,其他的辅助处理程序用来查看一个Web应用程序的各个页面的跟踪,以及阻塞对保护资源源的请求。

IHttpHandler接口

  学习Http处理程序编程首先熟悉IHttpHandler接口。这里我们只看同步HTTP处理程序,它实现了IHttpHandler接口。它包含两个成员:ProcessRequest该方法处理HTTP请求,和一个IsReusable属性,指示另一个请求是否可以使用该HTTP处理程序的实例。

Page类上IsReusable属性返回false,表示需要该HTTP请求的新实例来服务一个页面请求。通常我们使它在所有情况下都返回false。

 

  这里首先给出一个简单的HTTP处理程序

namespace CS
{
/// <summary>
/// 实现一个简单Http处理程序
/// </summary>
public class SimpleHandler : IHttpHandler
{

#region IHttpHandler 成员

public bool IsReusable
{
get { return true; }
}

void IHttpHandler.ProcessRequest(HttpContext context)
{
context.Response.Write(
"<H1>Hello,I'm an HTTP handler</H1>");
}

#endregion
}
}

然后配置web.config文件

<httpHandlers>
<add verb="*" path="helloword.aspx" type="CS.SimpleHandler"/>
</httpHandlers>

 

 

 

这样我们输入helloword.aspxURL请求就会出现以下画面

  下面这个Http处理程序提供了一种与IIS的低级请求和响应服务进行交互的方式。我们请求一个.sqlx资源,这里.sqlx文件内部其实是一个xml文件,例如:

 

<queries>
<query connString="Data Source=.\;Initial Catalog=db_http;User ID=sa;Password=asd123">
SELECT UserName,UserPhone,UserInfo from dt_User
</query>
<query connString="Data Source=.\;Initial Catalog=db_http;User ID=sa;Password=asd123">
SELECT CityName,Province from dt_City
</query>
</queries>

  内容就是一个连接数据库字符串和查询数据库的语句,通过QueryHandler通过对.sqlx请求将数据库中内容表示出来,如图:

这个地方能使IIS处理动态处理一个.sqlx 资源的请求而不是单纯返回该资源文件,我们就需要为它添加一个应承程序扩展名映射。我们选择aspnet_isapi.dll作为ISAPI扩展具体方法。这里具体怎么添加可以参考这里(景春雷大哥的一篇文章)(注意:这里也许出现一个问题就下图的“确定”按钮一直是灰色状态,原因是这里可执行文件编辑框字符串超过30,需要重新激活,我们只需要双击该编辑框重新激活即可。)

 

     也许大家会有疑问我读数据库里面内容难道不会直接调用页面中的控件,直接获取数据库中的内容啊?

  这里我只想说明下我们用自定的HTTP处理程序会比ASP.NET页面可能快的多(说可能是因为你自定义的HTTP处理程序说不定比ASP.NET页面更复杂)。虽说ASP.NET页面也是一个HTTP处理程序,但是其内部机制很复杂(例如有中间事件,视图管理等等)。这就降低asp .net页面服务请求的速度。

 

  最后还想说明一下我们还可以使用.ashx文件来定义HTTP处理程序。当对指定的.ashx资源请求时,该处理程序将被执行。通过建立专门的指定:@WebHandler来讲HTTP处理程序与.ashx资源之间进行关联。例如所有文件都必须以一个如下形式的开头

<%@ WebHandler class="Handler" %>

当调用与.ashx资源相对应的URL时,自动的调用Handler类。

   带.asah扩展的资源,由一个名为SimpleHandleFactory的HTTP处理程序类进行处理,而SimpleHandlerFactory是一个HTTP处理程序工厂类,而不是一个简单HTTP处理程序类。SimpleHandlerFactory在文件开头寻找@WebHandler指定。该源代码一旦被编译,@WebHandler指令告诉该处理工厂要实例化的HTTP处理程序类的名称。

 

本文知识来源:《ASP.NET2.0  高级编程》

程序环境:VS2008+SQL 2005

注意自己将.mdf文件附加到数据库中去,并修改一下数据库连接字符串。

本文程序下载

posted @ 2010-04-28 13:01  胡佳180815  阅读(2691)  评论(0编辑  收藏  举报