ASP.NET运行机制之一般处理程序(ashx)
一. 概述
?
?? 新建一个ashx文件? 代码如下
?
二. 解析
?
?? 1).
?
???? @WebHandler为ASP.NET页面的一个指令 指定为Http handler文件(.ashx)定义属性(Attribute)和编译选项
?????? 属性
??????????? Class 指定一个继承自IHttpHandler的类,当handler被请求时将被实例化用来响应请求。这个属性是必须的
??????????? CodeBehind 指定Class对应的文件,基本上没用,主要是用来支持VS显示的,可以去掉。
?
????? 编译选项
?????????? Debug 默认是false,所以非调试就不用打开,影响性能,可以省略
?????????? Description 关于当前handler的描述,ASP.NET解析时忽略,可能调试时能提供辅助信息,可以省略
?????????? Language 默认C# ,可以省略
?????????? WarningLevel 0-4 有默认值,可以省略。?? 2).
?
??????? 接下来是底下建立的类
??????????????????? 实现了一个关键的接口:System.Web.IHttpHandler。实现它表明将以何种方式来处理来自外部的请求。
???????????????????????????? 参数context是System.Web.HttpContext类型
???????????????????????????? context对象提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、
???????????????????????????????????????? Session 和 Server)的引用,也即可以访问我们的几大服务器对象。
????????????????????????????? 可以在ProcessRequest方法中编写如何处理请求的细节
?
????????????????????????? 而IsReusable表明其它的请求是否可以使用这个类的一个实例。
?
?
使用ashx的好处就是不需要在Web.Config中配置,就可以直接用IHttpHandler派生类来处理请求。
常见的应用场景:动态生成图片(比如验证码),响应Ajax请求等。
?
三. aspx、ascx和ashx
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="ASHXTest.aspx.cs"?Inherits="ASHXTest"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html?xmlns="http://www.w3.org/1999/xhtml">
<head?runat="server">
????<title>mytest</title>
????<script?type="text/javascript">
????????function?$(s)?{?if?(document.getElementById)?{?return?eval('document.getElementById("'?+?s?+?'")');?}?else?{?return?eval('document.all.'?+?s);?}?}
????????function?createXMLHTTP()?{
????????????var?xmlHttp?=?false;
????????????var?arrSignatures?=?["MSXML2.XMLHTTP.5.0",?"MSXML2.XMLHTTP.4.0",
?????????????????????????"MSXML2.XMLHTTP.3.0",?"MSXML2.XMLHTTP",
?????????????????????????"Microsoft.XMLHTTP"];
????????????for?(var?i?=?0;?i?<?arrSignatures.length;?i++)?{
????????????????try?{
????????????????????xmlHttp?=?new?ActiveXObject(arrSignatures[i]);
????????????????????return?xmlHttp;
????????????????}
????????????????catch?(oError)?{
????????????????????xmlHttp?=?false;?//ignore
????????????????}
????????????}
????????????//?throw?new?Error("MSXML?is?not?installed?on?your?system.");?
????????????if?(!xmlHttp?&&?typeof?XMLHttpRequest?!=?'undefined')?{
????????????????xmlHttp?=?new?XMLHttpRequest();
????????????}
????????????return?xmlHttp;
????????}
????????var?xmlReq?=?createXMLHTTP();
????????//?发送ajax处理请求(这里简单验证旧密码的有效性)
????????function?validateOldPwd(oTxt)?{
????????????var?url?=?"/HandlerTest.ashx?action=modifyPwd&pwd="?+?escape(oTxt.value);?//.ashx文件
????????????xmlReq.open("get",?url,?true);
????????????xmlReq.setRequestHeader("If-Modified-Since",?"0");
????????????xmlReq.onreadystatechange?=?callBack;
????????????xmlReq.send(url);?//?发送文本
????????}
????????function?callBack()?{
????????????if?(xmlReq.readyState?==?4)?{
????????????????if?(xmlReq.status?==?200)?{
????????????????????alert(xmlReq.responseText);?//?接收文本
????????????????}
????????????????else?if?(xmlReq.status?==?404)?{
????????????????????alert("Requested?URL?is?not?found.");
????????????????}?else?if?(xmlReq.status?==?403)?{
????????????????????alert("Access?denied.");
????????????????}?else
????????????????????alert("status?is?"?+?xmlReq.status);
????????????}
????????}
????</script>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<input?id="txtOldPwd"?type="text"?onblur="validateOldPwd(this)"?/>
????</div>
????</form>
</body>
</html>分析:
a、以前我们通常都是通过一个简单的aspx文件实现的功能,其实通过ashx也可以。
笔者曾经写过的一篇ajax:数据传输方式简介 ,通过对比,我们发现aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理;而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.比aspx少处理了html的过程(但是ashx也可以处理html的一些逻辑,只是通常都不这么用)。理论上ashx比aspx要快。
b、还是在相同的旧文里,我们知道数据传输的几种方式,其实ashx都可以实现(修改ashx文件里context.Response.ContentType 即可),这里不再赘述了。
(2)、ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。
(3)、.ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。
4、总结
aspx-->P(Page)
ascx-->C(Control)
ashx-->H(HttpHandler)当浏览器访问web服务器,我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签,在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来"变相"解释html的,说白了它就是为了提高生产率,它的技术术语再多,本质上还是html范畴内的东西(如果你不通过那些动态页面技术完全利用html和浏览器(当然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也相当可观).所以说web开发的底层就是一堆的html标签,无论是asp.net还是jsp都是对html某种方式的包装,是html的产物。
?