- 浏览: 52054 次
- 性别:
- 来自: 北京
文章分类
最新评论
一. 概述
新建一个ashx文件 代码如下
<%@ WebHandler Language="C#" Class="TestHandler" %> using System; using System.Web; public class TestHandler : IHttpHandler { //dd public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } //dd public bool IsReusable { get { return false; } } }
二. 解析
1).
<%@ WebHandler Language="C#" Class="TestHandler" %>
@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方法中编写如何处理请求的细节
<%@ WebHandler Language="C#" Class="ImageHandler" %> using System; using System.Web; /// <summary> /// 这就一个没有任何实现的一般处理程序。 /// </summary> public class ImageHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { //获取虚拟目录的物理路径。 string path = context.Server.MapPath(""); //获取图片文件的二进制数据。 byte[] datas = System.IO.File.ReadAllBytes(path + http://www.cnblogs.com/dongpo888/admin/file:////123.jpg); //将二进制数据写入到输出流中。 context.Response.OutputStream.Write(datas, 0, datas.Length); } public bool IsReusable { get { return false; } } }
而IsReusable表明其它的请求是否可以使用这个类的一个实例。
使用ashx的好处就是不需要在Web.Config中配置,就可以直接用IHttpHandler派生类来处理请求。
常见的应用场景:动态生成图片(比如验证码),响应Ajax请求等。
三. aspx、ascx和ashx
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接口.
一个简单的实现修改登录用户密码的示例:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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和页面部分):
<!--<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的产物。
发表评论
-
c#验证18位身份证号码
2012-08-16 19:55 809http://www.mysjtu.com/page/M0/S ... -
时间格式处理
2012-08-09 15:32 491http://szx-susan-com.iteye.com/ ... -
在IIS6下实现.net的伪静态设置
2012-05-08 00:12 731鉴于搜索引擎的友好度,伪静态成为一种趋势。 1、 打开iis, ... -
Visual Studio 2008中创建web用户控件
2011-04-25 18:42 648http://developer.51cto.com/art/ ... -
ASP.NET中JSON的序列化和反序列化
2011-04-23 10:35 622http://www.cnblogs.com/zhaozhan ... -
ASP.Net开发常见问题(1)
2011-03-01 17:01 6701. 打开新的窗口并传送参数: 传送参数: resp ... -
数据源控件
2010-09-11 14:03 519http://www.code-design.cn/blogd ... -
VS 2008 下面开发Serverlight 程序的配置 (转载)
2010-08-29 17:50 1310安装Silverlight 2.0 的浏览器插件,用于播 ... -
LinQ 技术专题
2010-08-29 17:46 599http://kb.cnblogs.com/zt/linq/l ... -
什么是 SilverLight?
2010-08-25 13:55 642SilverLight是Windows PresentATIo ... -
Grove—— .Net下的ORM框架
2010-08-25 13:36 573http://blog.csdn.net/weinasi325 ... -
清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 比较好
2010-08-20 18:20 680http://blog.csdn.net/21aspnet/a ... -
跨页面实现多选
2010-08-19 18:24 684本文介绍如何在ASP.NET中实现多页面选择的问题。其具体思路 ... -
超强幻灯片播放 HTC (VBS)
2010-08-17 11:39 719此文章大家自己 ... -
VS2008 开发将在VS2005打开
2010-08-15 17:20 631动手修改VS2008的解决方案文件,以让VS2005打开它&l ...
相关推荐
在ASP.NET web应用程序开发中,一般处理程序(.ashx文件)是一种轻量级的HTTP处理器,用于处理HTTP请求,而无需使用完整的ASP.NET页面生命周期。这种处理程序主要用于执行特定的任务,例如处理图像生成、XML服务或者...
本压缩包中的资源主要涉及如何使用Android客户端与ASP.NET服务器上的通用处理程序(Ashx)进行通信,并处理返回的JSON数据。以下是对这些知识点的详细解释: 1. **Android网络访问**:Android平台提供了多种方法来...
当一个HTTP请求到达Web服务器时,IIS(Internet Information Services)接收到这个请求,并将其传递给ASP.NET运行时,即HttpRuntime。HttpRuntime是ASP.NET的核心组件,负责管理和协调应用程序的生命周期以及请求...
在ASP.NET中,它处理的是如.aspx、.ascx、.ashx、.asmx等扩展名的文件。一旦确定,ASP.NET引擎就会接手并开始处理请求。 应用程序启动时,ASP.NET会创建一个名为ApplicationManager的类的实例,它负责创建一个应用...
Linux 下采用 Mono 和 Jexus 部署 ASP.NET-MVC、WCF、WebAPI、C 应用程序 Linux 系统下,采用 Mono 和 Jexus 可以实现 ASP.NET-MVC、WCF、WebAPI、C 应用程序的部署。Mono 是一个开源的、跨平台的 .NET 实现,能够...
ASP.NET是微软开发的一款用于构建Web应用程序的框架,它提供了丰富的功能和强大的错误处理机制,以确保应用程序在遇到异常情况时能优雅地处理错误并提供反馈。本文将深入探讨"Web错误统一处理"以及ASP.NET的错误处理...
此外,如果需要在服务器端处理KindEditor生成的内容,可以利用ASP.NET的服务器控件或ModelBinder机制,将编辑器内容转换为模型属性,便于进一步的业务逻辑处理。 总的来说,将KindEditor集成到ASP.NET应用中,可以...
对于开发和运行基于ASP.NET的Web应用程序来说,.NET Framework 2.0是一个关键组件。这篇内容将深入探讨如何在WIN2003上的IIS中安装和配置ASP.NET插件,以及.NET Framework 2.0的相关知识点。 首先,我们需要了解...
ASP.NET架构基础知识主要涵盖Web应用程序...总之,ASP.NET的请求处理机制是其强大功能的基础,它使得开发者能够创建高度交互的Web应用程序。通过了解这一流程,开发者可以优化性能,解决调试问题,并提升整体开发效率。
这种动态编译不仅限于ASP.NET页面,还包括.NET Web服务(`.asmx`文件)、Web用户控件(`.ascx`文件)、HTTP处理程序(`.ashx`文件)以及全局应用程序文件(global.asax)等。动态编译的过程由一系列运行时模块组成的管道来...
- **ASHX自定义处理程序**:轻量级的处理程序,用于处理非页面请求,如服务接口。 6. **事件模型** - **HttpApplication事件**:如BeginRequest、EndRequest、AuthenticateRequest等,这些事件在HTTP请求生命周期...
在这个系统中,Web层主要包含ASP.NET页面(.aspx)、用户控件(.ascx)和HTTP处理程序(.ashx)。这些组件直接与用户交互,接收和响应HTTP请求。 2. **ASP.NET页面生命周期**: 当一个.aspx页面被请求时,它会经历...
HttpHandler则负责处理特定类型的请求,如.aspx页面、.ashx自定义处理程序等。 11. HttpContext,HttpModules和HttpHandlers HttpContext是每个请求的上下文对象,它包含请求和响应的详细信息。HttpModules在请求...
其次,ASP.NET提供了多种网页类型,如ASPX(包含HTML和服务器控件的网页)、ASHX(HTTP处理程序,用于处理特定的HTTP请求)和ASMX(Web服务,支持XML Web服务)。开发者可以根据需求选择合适的网页类型进行开发。 ...
在服务器中,ASP.NET框架解释信息,并触发事件与之对应的处理程序。该程序可以是.aspx页面中的处理程序,也可以是开发者自定义的类库,或者COM组件等。事件驱动处理如图4-7所示。 图4-7 页面框架的事件驱动处理...
在这个项目中,ASP.NET为文件上传系统提供了一个运行环境和服务器端处理机制。 3. **无刷新文件上传**:无刷新文件上传是指用户在不刷新整个页面的情况下,能够完成文件的上传。这通常通过Ajax技术实现,利用...
1. **创建proxy.ashx文件**:根据提供的源代码或者下载的包,创建一个ASP.NET的HTTP处理程序。 2. **配置IIS**:将proxy.ashx添加到IIS站点中,并设置正确权限。 3. **设置ArcGIS服务**:在ArcGIS Server上,为...
开发者会为每个功能创建对应的处理程序(如ASPX页面或ASHX Handler),并在这些处理程序中编写具体的C#或VB.NET代码。 增删改查功能的实现涉及到页面的生命周期管理。当用户点击“提交”按钮时,按钮的Click事件会...
在ASP.NET和Silverlight的结合下,实现图片批量上传是一项常见的需求,特别是在构建具有丰富交互性的Web应用程序时。此技术结合了ASP.NET服务器端处理能力和Silverlight客户端的用户体验优势,提供了一种高效、便捷...
在深入剖析ASP.NET的编译原理之前,我们先要理解Web应用程序的基本运行机制。传统的Web应用是通过HTTP协议,每次请求都触发服务器上的脚本或代码执行,然后返回结果给客户端。然而,ASP.NET引入了“编译式”的概念,...