你不想创建一个普通ASP.NET的Web窗体页。而又要通过一个查询字符串返回一个动态的图片、XML或者非HTML网页。这是一个用C#编程语言编写的使用ASHX(一般处理程序)的简单教程。
简介
首先,我们来回顾一下使用ASHX文件的目的。也许我们想在URL中使用这个ASHX文件动态的返回数据内容。我们使用的URL查询字符串如下:http://www.dotnetperls.com/?file=name.
入门:怎么添加一个ASHX文件呢?
打开你的ASP.NET网站,在网站上点击"添加新项"的菜单,此时打开了"添加新项"窗口,选择一般处理程序(Generic Handler),这时你将看到一个有一些代码的Handler.ashx文件。
自动生成的代码
我们注意到在ASHX文件中自动生成的代码,定义了IHttpHandler接口的2个方法。最重要的方法是ProcessRequest(),无论是请求还是输出,这个方法都会被调用到。你不应该修改任何默认继承的接口成员。
URL映射
通常,使用一个新的URL替代旧的URL或者路径是可行的。为了向后兼容和搜索引擎优化,在你的网站上,你也许想用新的处理程序代替一个旧的URL地址。用URL映射可以解决此问题。当然,你也可以用更复杂的路径重写方法。
Web.config中的部分代码
<system.web> <urlMappings enabled="true"> <add url="~/Default.aspx" mappedUrl="~/Handler.ashx"/> </urlMappings> …… </system.web>
以上代码将自动将一个连接转到另一个上面。当Default.aspx页面被请求时,Handler.ashx文件将取而代之。这意味着:你的目录默认页面将自动导航到一般处理程序上。
添加示例图片
在这里,你也许会用ASHX文件处理图片文件。在桌面或者网络上找一会你最喜欢的图片,把它添加到你的项目中。例如,我选择的图片是"Flower1.png",下面我将在ASHX文件中使用这个图片。
修改Handler.ASHX文件
你的Handler有2个方法,我们必须修改ProcessRequest()方法,可以修改文件的ContentType和输出内容。通过下面类似的代码可以修改你的图片文件名和ContentType属性。
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/png"; context.Response.WriteFile("~/images/ Flower1.png"); }
public bool IsReusable { get { return false; } }
测试处理程序
在本地测试ASHX文件。点击网站绿色的运行按钮。你将在浏览器上看到你的图片文件。这是处理程序中输出的图片返回结果。
到目前位置,上面的例子是没有任何作用的。主要就是让我们通过ASHX处理一个图片文件。你可以在ASHX文件添加任何逻辑代码或者逻辑引用。开发者通常需要使用请求的查询字符串集合。你可以像在ASPX文件中使用的方法一样请求查询字符串:Request.QueryString["file"]。
上面的代码通过基于查询字符串集合,收到请求然后返回不同的图片文件。他将通过查询字符串返回二个图片中的一个。
例如:
URL = http://www.dotnetperls.com/?file=logo File query string: logo File written: Logo1.png URL = http://www.dotnetperls.com/?file=flower File query string: flower File written: Flower1.png
测试查询字符串
做了这么多准备工作。开始测试吧!打开你的浏览器,在URL路径上添加上面的查询字符串。你会看到ASP.NET由Default.aspx页面导航到Handler.ashx页面。并且,他将通过获取查询变量返回适当的文件。
用途
这些代码可以用作访问者数量的计数器或者日志推荐的数量计数器。由于浏览器和Bot的区别,这将比服务器日志提供更准确的访问数量。
性能
你也许想知道,使用ASHX文件,是否会带来一些性能的优势或改变呢?ASHX文件并不复杂,而且不涉及更多事件的调用。正如你想象的那样,一个请求处理10几个事件比处理一个事件将消耗更多的性能。所以,在可能的情况下使用ASHX文件吧,他将会带来一些性能的优势。
选择处理程序
那什么时候用客户端处理程序,什么时候使用Web窗体文件呢?一般处理程序在处理二进制数据更有优势,而Web窗体在做快速开发方面更好。
控制树
在ASP.NET框架中,Web窗体使用一种称为控制树的概念(网页都保存在一个对象模型中)。当你不需要客户端的控制树或者整个网站架构的时候,使用一般处理程序,这将会带来更好的性能优势和简单的代码调试。
IsReusable 属性
我不知道IsReusable属性在ASP.NET中的作用。通过阅读表名,他能在不破坏反复程序处理的情况下提高性能、减少内存压力。
总结
在这篇文章中,教给你怎么在自己的网站中使用ASHX自定义处理程序。通过修改后,能填充到更多重要的网站中。结合自定义查询字符串的URL映射,可以大大简化和优化你的网站后台代码。
做好一个.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="images/1.jpg" height="300px" /> </div> <a href="#" onclick="GetImg(1)">1</a> <a href="#" onclick="GetImg(2)">2</a> <a href="#" onclick="GetImg(3)">3</a> </div> </form> </body> </html> <script type="text/javascript"> function GetImg(index) { var myImg = document.getElementById('img'); myImg.src = './imageHandle.ashx?id=' + index; } </script>
这个例子是这样的,有三个链接,分别为1、2、3,点击后显示对应的图片。