网站有多少个,cpa做电影网站侵权吗,百度搜索广告投放,网站建设科做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们#xff0c;网上有很多文章介绍。“纸上得来终觉浅#xff0c;绝知此事要躬行”#xff0c;下面自己总结一下做个笔记。1、.aspx Web窗体设计页面。Web窗体页由两部分组成#xff1a;视觉元素#xff08;html、服…做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接口. 一个简单的实现修改登录用户密码的示例 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Web.SessionState; namespace Test { public class HandlerTest : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ClearContent(); context.Response.ContentType text/plain; context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //无缓存 string action context.Request.Params[action]; //外部请求 if (action modifyPwd) //用户改密码 { string oldPwd context.Request.Params[pwd]; //在ashx文件用使用Session必须实现IRequiresSessionState接口 //Session[LogedUser]是登录用户的会话,用户名和密码都是test if (oldPwd.ToUpper() ! ((context.Session[LogedUser]) as Customer).Password.ToUpper()) //用户输入的旧密码和当前登录用户的不相同 { context.Response.Write(旧密码输入错误!); } else { context.Response.Write(旧密码输入正确!); } } context.Response.End(); } public bool IsReusable { get { return true; } } } }
客户端的调用js和页面部分 % Page LanguageC# AutoEventWireuptrue CodeBehindASHXTest.aspx.cs InheritsASHXTest % !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd html xmlnshttp://www.w3.org/1999/xhtml head runatserver titlemytest/title script typetext/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?actionmodifyPwdpwd 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 idform1 runatserver div input idtxtOldPwd typetext οnblurvalidateOldPwd(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特别适合于生成动态图片生成动态文本(纯文本jsonxmljavascript等即可)等。 3、.ashx文件有个缺点它处理控件的回发事件非常麻烦。处理数据的回发通常都需要一些.aspx页的功能只有自己手动处理这些功能还不如直接建一个aspx文件来处理。所以一般使用.ashx输出一些不需要回发处理的项目即可。 4、总结 aspx--PPage ascx--CControl ashx--HHttpHandler
当浏览器访问web服务器我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来变相解释html的说白了它就是为了提高生产率它的技术术语再多本质上还是html范畴内的东西如果你不通过那些动态页面技术完全利用html和浏览器当然包括js技术来实现动态页面效果那么你会发现效果有了代码量也相当可观.所以说web开发的底层就是一堆的html标签无论是asp.net还是jsp都是对html某种方式的包装是html的产物。 在VS中右击项目添加新项我们找到.ashx文件在新建项模板中叫做“一般处理程序”那么这个一般处理程序用来干吗的呢
我们可以这样地简单理解嗯不需搞得太复杂它就类似.aspx文件用于处理传入到服务器的HTTP请求但它不会像.aspx文件那样要返回处理结果和大量HTML它可以返回简单的字符串、图片等。 大家知道HttpHandle需要在Web.Config文件中进行相应的配置那么如果不配置呢能否直接使用可以的来动手玩玩。 1、在项目中添加一个.ashx文件并改写默代码如下
using System; using System.Web; public class imageHandle : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType image/jpeg; string imgPath ~/images/{0}.jpg; //根据请求的查询字符串显示对应图片 switch (context.Request.QueryString[id]) { case 1: context.Response.WriteFile(context.Server.MapPath(string.Format(imgPath, 1))); break; case 2: context.Response.WriteFile(context.Server.MapPath(string.Format(imgPath, 2))); break; case 3: context.Response.WriteFile(context.Server.MapPath(string.Format(imgPath, 3))); break; default: //默认显示第一张图片 context.Response.WriteFile(context.Server.MapPath(string.Format(imgPath, 1))); break; } } public bool IsReusable { get { return true; } } }
我简单说一下这个类根据请求的查询参数返回对应的图片所以你可以随便准备3张图片做测试。 2、做好.aspx页面。 % Page LanguageC# AutoEventWireuptrue CodeFileDefault.aspx.cs Inherits_Default % !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd html xmlnshttp://www.w3.org/1999/xhtml head runatserver title/title /head body form idform1 runatserver div div img idimg srcimages/1.jpg height300px / /div a href# οnclickGetImg(1)1/a a href# οnclickGetImg(2)2/a a href# οnclickGetImg(3)3/a /div /form /body /html
这个例子是这样的有三个链接分别为1、2、3点击后显示对应的图片。
.
我们在不配置Web.Config的情况下应用了HttpHandle下面我配置一下Web.Config文件。
找到HttpHandlers节并添加一个节点。
add verb* pathloadimg typeimageHandle validatefalse/
然后把.aspx页面也改一下。
script typetext/javascript function GetImg(index) { var myImg document.getElementById(img); myImg.src ./loadimg?id index; } /script
这时候神奇地发现无效了。咋回事呢是不是没有把文件放进App_Code的原因
把.ashx文件扔到App_Code目录下结果发现还是不行。
于是我不用.ashx文件直接新建一个.cs文件把刚才.ashx里面的C#代码复制过去并把类名改一下接着运行。 这回成功了是不是就说明在Web.Config中配置的httpHandler对于.ashx中定义的类是无效的