Ashx的处理实例(逻辑处理/js调用)


做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有很多文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面自己总结一下做个笔记。
1、.aspx
Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。
2、.ascx
asp.net的用户控件,是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不允许Web客户端通过url来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。
3、.ashx
前面两个都太熟悉了,这个才是要讲的重点。
(1)、使用举例
.ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口.
一个简单的实现修改登录用户密码的示例:


usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.SessionState;

namespaceTest
{

publicclassHandlerTest:IHttpHandler,IRequiresSessionState
{

publicvoidProcessRequest(HttpContextcontext)
{
context.Response.ClearContent();
context.Response.ContentType
="text/plain";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
//无缓存

stringaction=context.Request.Params["action"];//外部请求
if(action=="modifyPwd")//用户改密码
{
stringoldPwd=context.Request.Params["pwd"];

//在ashx文件用使用Session必须实现IRequiresSessionState接口
//Session["LogedUser"]是登录用户的会话,用户名和密码都是test
if(oldPwd.ToUpper()!=((context.Session["LogedUser"])asCustomer).Password.ToUpper())//用户输入的旧密码和当前登录用户的不相同
{
context.Response.Write(
"旧密码输入错误!");
}
else
{
context.Response.Write(
"旧密码输入正确!");
}
}


context.Response.End();
}

publicboolIsReusable
{
get
{
returntrue;
}
}
}
}

客户端的调用(js和页面部分):


<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="ASHXTest.aspx.cs"Inherits="ASHXTest"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>mytest</title>
<scripttype="text/javascript">
function$(s){if(document.getElementById){returneval('document.getElementById("'+s+'")');}else{returneval('document.all.'+s);}}

functioncreateXMLHTTP(){
varxmlHttp=false;
vararrSignatures=["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for(vari=0;i<arrSignatures.length;i++){
try{
xmlHttp
=newActiveXObject(arrSignatures[i]);
returnxmlHttp;
}
catch(oError){
xmlHttp
=false;//ignore
}
}
//thrownewError("MSXMLisnotinstalledonyoursystem.");
if(!xmlHttp&&typeofXMLHttpRequest!='undefined'){
xmlHttp
=newXMLHttpRequest();
}
returnxmlHttp;
}

varxmlReq=createXMLHTTP();

//发送ajax处理请求(这里简单验证旧密码的有效性)
functionvalidateOldPwd(oTxt){
varurl="/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);
//发送文本
}

functioncallBack(){
if(xmlReq.readyState==4){
if(xmlReq.status==200){
alert(xmlReq.responseText);
//接收文本
}
elseif(xmlReq.status==404){
alert(
"RequestedURLisnotfound.");
}
elseif(xmlReq.status==403){
alert(
"Accessdenied.");
}
else
alert(
"statusis"+xmlReq.status);
}
}

</script>

</head>
<body>
<formid="form1"runat="server">
<div>
<inputid="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的产物。

优质内容筛选与推荐>>
1、PHP Curl进行Post时指定 multipart/form-data 或 application/x-www-form-urlencoded 的方法
2、算法尝试(一)
3、上课动手动脑
4、llinux其他权限
5、shell 输出九九乘法表


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn