使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。

最近在做我们单位的内部一个系统,使用了类似于Asp.Net 2.0里面的Theme(主题)的功能。此功能的核心是一个动态的CSS定义,根据用户选择的不同主题内容来发送不同的CSS样式文本。
本来这个问题很好解决,在HTML中的<head>区内使用一个:
<%#= base.GetCssInclude() %>
就可以解决,不过我没有用这个办法。

我注意了VS2005中Web应用程序项目模板里的Generic Handler 项,发现它是一个.ashx文件,实际上它是一个HttpHandler。后来查了一下.Net SDK文档,发现Asp.Net1.1也支持.ashx,但是没有给出详细内容。

我们都知道,HttpHandler是一个彻底自定义Http请求的方法,它通过web.config来定义Asp.Net运行时来过滤出要自定义的Http请求,发送到定义在web.config的指定类中。

利用.ashx文件是一个更好的方法,这个文件类似于.aspx文件,可以通过它来调用HttpHandler类,从而免去了普通.aspx页面的控件解析以及页面处理的过程。这个文件特别适合于生成动态图片,生成动态文本等内容。

建立方法如下:
首先打开一个Web项目,然后在任意目录下使用VS2003解决方案资源管理器的“添加”-->“添加新项”,在对话框中选择“文本文件”,然后在文件名处输入“TextBuilder.ashx”。

然后在同目录下,使用解决方案资源管理器,使用“添加”-->“添加类”,在类文件名处输入“TextBuilder.ashx.cs”。可以看出,它的文件命名规律与.aspx文件相同。

然后在.cs文件处输入以下代码(名称空间略):
using System.Web
public sealed class TextBuilder : IHttpHandler
{
    
public void ProcessRequest(HttpContext context)
    
{
        context.Response.ClearContent();
        context.Response.ContentType 
= "text/plain";
        context.Response.Write(
"Hello World");
        context.Response.End();
    }


    
public bool IsReusable
    
{
        
get return true; }
    }

}

然后在“TextBuilder.ashx”文件的第一行处输入上面这个类的调用代码:
<%@ WebHandler language="C#" Class="MyNamespace.TextBuilder" codebehind="TextBuilder.ashx.cs" %>
上面的代码需要注意的是:必须在Class项中输入类的完整名称,即包括名称空间及类名称。

最后保存并编译项目。

使用IE测试,输入这个.ashx的地址即可。

大家可以看出Response类有个OutputStream方法,可以向客户端输出二进制数据流,所以在我的项目中,使用这个方法,在一个.ashx中使用DundasChart控件就可以生成非常好的统计图,用它发送二进制数据,方便快捷,而且不需在web.config内输入任何配置代码。

.ashx文件有个缺点,他处理控件的回发事件非常麻烦,比如说如果用它来生成DataGrid的列表也不是不行,但是处理数据的回发,需要一些.aspx页的功能,只有自己手动处理这些功能。所以,一般使用.ashx,用来输出一些不需要回发处理的项目即可。

posted on 2005-01-22 16:47 笑望人生 阅读(12448) 评论(14) 编辑 收藏

评论

#1楼  回复 引用 查看   

这种方法同使用一个aspx页面没有什么不同阿。当我使用aspx页面的时候,也可以使用Response.Write的方法输出二进制内容阿
2005-01-22 18:29 | 红马天下      

#2楼[楼主]  回复 引用 查看   

但是.aspx要做html控件树解析,它的.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。
2005-01-22 19:23 | 笑望人生      

#3楼  回复 引用   

这个有新意!
2005-01-22 19:42 | Ariel[未注册用户]

#4楼  回复 引用   

感觉这里用ashx文件并不是*.ashx的初衷,我想问一下,通常ashx做什么用的
2005-05-08 15:52 | tt

#5楼  回复 引用   

微软文档
------------------------------
在 ASP.NET 中,主要使用两种方法来创建 HTTP 处理程序。第一种是通过创建带有 ASHX 扩展名的文件,另一种是创建实现 System.Web.IHttpHandler 的类,请参阅 IHttpHandler Interface。本文将着重介绍第二种形式。要创建 HTTP 处理程序,需要创建一个程序集(通常是一个代码库项目)和一个实现 System.Web.IHttpHandler 的类。然后将该类注册到 Web.Config(或 machine.config)文件中,然后它就可以接收请求了。如果查看 machine.config 文件(在相应命名的 httpHandlers 节中),将看到许多当前已注册的 HTTP 处理程序,包括 System.Web.UI.PageHandlerFactory(ASP.NET 页面的主处理程序)。在编写 HTTP 处理程序时,其实就是在定义处理请求的新方法。
-------------------------------------

aspx也可以实现相同的效果,但稍微麻烦一点,需要更改web.config文件,

2005-05-13 10:55 | 小峰[未注册用户]

#6楼  回复 引用   

可是还是不知道怎么实现CSS的自动换,这个东西怎么自动调用呢?
2005-08-17 11:23 | dfs[未注册用户]

#7楼  回复 引用 查看   

我觉得用在XMLHTTP上返回数据是个好方法!!!

别的我就想不出有什么好的了
2006-04-21 15:16 | 感觉      

#8楼  回复 引用 查看   

请问从那里可以得到微软关于ashx的文档?
谢谢
2006-08-25 12:39 | stswordman      

#9楼  回复 引用   

好,收藏。
2007-01-09 11:20 | 虫子[匿名][未注册用户]

#10楼  回复 引用   

始终就没有用过 谢谢了
2007-02-04 22:52 | net[未注册用户]

#11楼  回复 引用   

想做RSS feed的了
这个太有用了
按自己的意思返回文档
没有html那些东西
好东西啊
2007-09-04 22:04 | 李洪印[未注册用户]

#12楼  回复 引用 查看   

受用了哈
2008-03-13 08:57 | bigbigdonet      

#13楼  回复 引用 查看   

--引用--------------------------------------------------
感觉: 我觉得用在XMLHTTP上返回数据是个好方法!!!

别的我就想不出有什么好的了
--------------------------------------------------------
同感
2008-03-31 10:20 | kkun      

#14楼  回复 引用 查看   

这个真是好东西
可以用在图片输出和ajax
2008-10-16 16:18 | cloudgamer