作asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有不少文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面本身总结一下作个笔记。
一、.aspx
Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中建立。
二、.ascx
asp.net的用户控件,是做为一种封装了特定功能和行为(这二者要被用在Web应用程序的各类页面上)的Web页面被开发的。一个用户控件包含了html、代码和其余Web或者用户控件的组合,并在Web服务器上以本身的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不容许Web客户端经过url来访问这些文件,可是这个网站的其余页面能够集成这些文件里所包含的功能。
三、.ashx
前面两个都太熟悉了,这个才是要讲的重点。
(1)、使用举例
.ashx文件是主要用来写web handler的。使用.ashx 可让你专一于编程而不用管相关的web技术。咱们熟知的.aspx是要作html控件树解析的,.aspx包含的全部html其实是一个类,全部的html都是类里面的成员,这个过程在.ashx是不须要的。ashx必须包含IsReusable属性(这个属性表明是否可复用,一般为true),而若是要在ashx文件用使用Session必须实现IRequiresSessionState接口.
一个简单的实现修改登陆用户密码的示例:javascript
Code
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;
}
}
}
}
html
客户端的调用(js和页面部分):java
Code
<%@ 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>
web
分析:
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输出一些不须要回发处理的项目便可。
四、总结
aspx-->P(Page)
ascx-->C(Control)
ashx-->H(HttpHandler)ajax
当浏览器访问web服务器,咱们最终接收到的仍是html文本。浏览器经过渲染引擎解释这些标签,在屏幕上展示出可见的效果。而asp.net不过就是咱们应用的一种平台技术来"变相"解释html的,说白了它就是为了提升生产率,它的技术术语再多,本质上仍是html范畴内的东西(若是你不经过那些动态页面技术彻底利用html和浏览器(固然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也至关可观).因此说web开发的底层就是一堆的html标签,不管是asp.net仍是jsp都是对html某种方式的包装,是html的产物。编程