该模式改善XMLHTTP + WebForm存在的问题,其使用HttpHandler处理请求(Request)的消息和发送响应(Response)。
HttpHandler是Http的处理核心之一,它实现了ISAPI Extention的功能。HttpHandler的功能是通过实现IHttpHandler接口来实现的。一个简单的Http请求处理过程如下图:
Web请求首先到达IIS,通过aspnet_isapi.dll把请求传递给ASP.NET引擎;在ASP.NET引擎中对Web请求经过多个HTTP Module的处理,最后到达HTTP Handler;HTTP Handler再把处理后的结果返回给IIS,IIS负责进一步把这个结果返回给发出请求的客户端。
由上面处理过程可以看出,在ASP.NET管理处理的末端是HTTP Handler。其实每个ASP.NET的Page都实现了IHttpHandler,在Visual Studio.net中的page类对象查看器中可以证实这一点,具体的Page类代码如下:
![](https://pic002.cnblogs.com/images/2011/127318/2011070818292283.jpg)
接口IHttpHandler包括一个方法和一个属性。ProcessRequest方法是添加自己的代码进行相应处理的地方;IsReuseable属性指明该HttpHandler的实现类是否需要缓存。具体定义代码如下所示:
//IHttpHandler接口
interface IHttpHandler
{
void ProcessRequest(HttpContext ctx);
bool IsReuseable{get;}
}
Handler的实现
新建一个类库工程,命名HelloAjax,然后添加一个实现IHttpHandler接口类HttpHandler:
using System;
using System.Web;
using System.Text;
namespace HelloAjax
{
public class HttpHandler:IHttpHandler
{
#region IHttpHandler 成员
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
string str = "服务器Hander得到了您输入的信息:" + context.Request["msg"] + "<br/>您的IP地址是:";
str += context.Request.UserHostAddress;
str += "<br/>当前服务器的时间:";
str += DateTime.Now.ToLocalTime();
context.Response.Write(str);
}
#endregion
}
}
using System.Web;
using System.Text;
namespace HelloAjax
{
public class HttpHandler:IHttpHandler
{
#region IHttpHandler 成员
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
string str = "服务器Hander得到了您输入的信息:" + context.Request["msg"] + "<br/>您的IP地址是:";
str += context.Request.UserHostAddress;
str += "<br/>当前服务器的时间:";
str += DateTime.Now.ToLocalTime();
context.Response.Write(str);
}
#endregion
}
}
编译后得到的HelloAjax.dll就是要用到的Handler。
改良工作
首先,项目中添加对Handler的引用
然后,Web.config的system.HttpHandler中配置如下节
<httpHandlers>
<add verb="GET,POST"
path="*.ashx"
type="HelloAjax.HttpHandler,HelloAjax"/>
</httpHandlers>
最后,客户端请求的URL需改为以.ashx为扩展名
<add verb="GET,POST"
path="*.ashx"
type="HelloAjax.HttpHandler,HelloAjax"/>
</httpHandlers>
最后,客户端请求的URL需改为以.ashx为扩展名