【转】aspx,ascx和ashx使用小结
做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 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" οnblur="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的产物。
在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 Language="C#" AutoEventWireup="true" CodeFile="Default.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 xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div>
<img id="img" src="data:images/1.jpg" height="300px" />
</div>
<a href="#" οnclick="GetImg(1)">1</a>
<a href="#" οnclick="GetImg(2)">2</a>
<a href="#" οnclick="GetImg(3)">3</a>
</div>
</form>
</body>
</html>
这个例子是这样的,有三个链接,分别为1、2、3,点击后显示对应的图片。
.
我们在不配置Web.Config的情况下应用了HttpHandle,下面我配置一下Web.Config文件。
找到HttpHandlers节,并添加一个节点。
<add verb="*" path="loadimg" type="imageHandle" validate="false"/>
然后,把.aspx页面也改一下。
<script type="text/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中定义的类是无效的?
【转】aspx,ascx和ashx使用小结相关推荐
- aspx,ascx和ashx使用小结
做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网上有很多文章介绍."纸上得来终觉浅,绝知此事要躬行",下面自己总结一下做个笔记. 1..aspx ...
- .aspx,.ascx和.ashx的关系
在另一家博客看到了非常好的总结,在这里转载一下,不作商业用途. 1..aspx Web窗体设计页面.Web窗体页由两部分组成:视觉元素(html.服务器控件和静态文本)和该页的编程逻辑(VS中的设计视 ...
- 如何强制Visual Studio重新生成aspx / ascx文件的.designer文件?
有时当我正在编辑页面或控制时,.designer文件停止使用我正在页面上放置的新控件进行更新. 我不确定是什么导致这种情况发生,但我想知道是否有任何方法迫使Visual Studio重新生成.desi ...
- ashx返回图片_显示ashx图片
ascx aspx ashx asmx 文件的作用 ascx aspx ashx asmx 文件的作用 ascx: Ascx 是给予Web的用户控件(UserControl),一般是用来重用的,不能直 ...
- ashx需要编译吗_ASP.NET运行机制之一般处理程序(ashx)
做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网上有很多文章介绍."纸上得来终觉浅,绝知此事要躬行",下面自己总结一下做个笔记. 1..aspx ...
- aspx、ashx、asmx文件处理请求效率比较
aspx.ashx.asmx文件处理请求效率比较 原文: http://www.cnblogs.com/liuche/p/3464051.html 你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最 ...
- Jquery Ajax 登录,服务端分别为 aspx,ashx,asmx
Jquery Ajax 登录,服务端分别为 aspx,ashx,asmx 原文: http://www.cnblogs.com/StudyLife/archive/2012/02/22/2363174 ...
- 一般处理程序(ashx)和页面处理程序(aspx)的区别
客官请看图 图中的Httphandler就是处理程序. 两者的共同点 如果把aspx处理程序和ashx处理程序放到上图中,他们是处在相同的位置的, 他们都实现了IHttphandler接口.实现了IH ...
- asp.net的处理机制(.ashx/.aspx)
浅谈自己对asp.net 处理机制的图解 图解的内容有点多(包含asp.net 的处理机制和页面生命周期的重要事件,建议小伙伴把图片下载查看可好?) asp.net处理机制解说 当浏览器发送一条请求给 ...
最新文章
- python复合数据类型_python—组合数据类型
- iphone,ipad,关于icon图标的那些事
- java依赖注入上下文_【Java EE】--Contexts and Dependency Injection (上下文與依賴注入)04...
- B/S系统常见缺陷整理和解决方案
- H5实例教学--微信内嵌视频1(案例浅析)
- Memcached原理分析
- cron 每年执行一次_循环执行定时任务crontab
- bose耳机信号断续_最强真无线降噪耳机?BOSE QC Earbuds消噪耳塞上手评测
- 嵩天-Python语言程序设计程序题--第四周:程序的控制结构
- 前端学习(2963):跨域问题
- 区块链上智能合约的讲解
- 面试题:找出公司员工最喜欢的k种水果
- 如何在 Mac 上合并 PDF?
- Java 多版本JDK 环境配置 javac和java 版本不一致
- 大数据分析-实验八 鸢尾花数据集分类
- 百度指数 php,百度指数是什么?百度指数有什么用?百度指数怎么用?
- WPS Excel表格怎么启用宏功能?
- leet55.跳跃游戏
- Xneomai 简介
- 关于Visual studio 2015 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包的解决方案