1.基本原理图
IsReusable属性用来表示在IHttpHandlerFactory对象创建IHttpHandler的时候是否能够将这个Handler存入池中以便重用。
一般处理程序(HttpHandler):是一个实现System.Web.IHttpHandler接口的特殊类。任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提。(凡是没有实现此接口的类,就不能被浏览器请求。)
它由支持ASP.NET的服务器调用和启动运行。一个HttpHandler程序负责处理它所对应的一个或一组URL地址的访问请求,并接收客户端发出的访问请求信息(请求报文)和产生响应内容(响应报文)。
简单的说:咱可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码发送回客户端浏览器。
HttpHandler程序可以完成普通类程序所能完成的大多数任务:
1.获取客户端通过HTML的Form表单提交的数据和URL参数
2.创建对客户端的响应消息内容
3.访问服务器端的文件系统
4.连接数据库并开发基于数据库的应用
5.调用其他类
2.生命周期:
请求管道的19个事件:
(1)BeginRequest: 开始处理请求
(2)AuthenticateRequest授权验证请求,获取用户授权信息
(3):PostAuthenticateRequest获取成功
(4): AunthorizeRequest 授权,一般来检查用户是否获得权限
(5):PostAuthorizeRequest:获得授权
(6):ResolveRequestCache:获取页面缓存结果
(7):PostResolveRequestCache 已获取缓存 当前请求映射到MvcHandler(pr): 创建控制器工厂 ,创建控制器,调用action执行,
view→response
(8):PostMapRequestHandler 创建页面对象:创建 最终处理当前http请求的 Handler 实例: 第一从HttpContext中获取当前的PR Handler
,Create
(9):PostAcquireRequestState 获取Session
(10)PostAcquireRequestState 获得Session
(11)PreRequestHandlerExecute:准备执行页面对象
执行页面对象的ProcessRequest方法
(12)PostRequestHandlerExecute 执行完页面对象了
(13)ReleaseRequestState 释放请求状态
(14)PostReleaseRequestState 已释放请求状态
(15)UpdateRequestCache 更新缓存
(16)PostUpdateRequestCache 已更新缓存
(17)LogRequest 日志记录
(18)PostLogRequest 已完成日志
(19)EndRequest 完成、
3.一个小例子——前台实现用户名的验证
在说一般处理程序之前,先来看看什么是aspx。在vs中,使用的大多是aspx页面。aspx页面就
是在接收到一个请求之后,将返回的结果生成一个html页面返回给服务器。当我们有时候需要自己来处理这个结果,而不是直接返回html的时候。怎么做呢?这时候就需要一般处理程序了。一般处理程序就是这样一个只有cs页面,而没有前台的文件。扩展名为ashx。
实例验证用户名
JS
<script type="text/javascript" >
//验证用户名是否正确
function JudgeUserName() {
var username = $("#userName").val()
$.ajax({
type: "Post",
url: 'RegisterUserNameVerity.ashx/ProcessRequest?username='+username,
success: function (result) {
if (username == "") {
alert("用户名不能为空!");
document.getElementById("userName").focus();
document.getElementById("userName").selected;
} else {
if (result == "True") {
alert("已存在,请您重新选择一个用户名!")
document.getElementById("userName").focus;
document.getElementById("userName").select();
}
}
},
});
}
</script>
Html
<input type="text" onblur="JudgeUserName()" />
一般处理程序
1 public void ProcessRequest(HttpContext context) 2 { 3 //获取从前台传过来 4 string userName = context.Server.UrlDecode(context.Request.QueryString["username"]); 5 //声明查询用户名是否存在的对象 6 userBLL verifyusernamebll = new userBLL(); 7 //通过其他的函数来判断 8 bool flag=verifyusernamebll.Exists(userName); 9 if (flag==true) 10 { 11 context.Response.Write(true); 12 } 13 else 14 { 15 context.Response.Write(false); 16 } 17 }