笑望人生

微笑面对人生,开心享受生活。
数据加载中……

使用.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 笑望人生 阅读(10582) 评论(16)  编辑 收藏 网摘 所属分类: 写程序的心得和感想。

评论

#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楼   回复  引用    

afsdafsd
2005-06-18 13:26 | afsd[未注册用户]

#7楼   回复  引用    

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

#8楼   回复  引用    

<SCRIPT>
var oPopup = window.createPopup();
var popTop=0;
var picwidth=1024; ?图片宽
var picheight=768; ?图片高
var picadd='http://www.123xz.net/uploadfiles/2005-09/20050910_230625256.jpg'; ? 图片地址
var w3seas=100; ?完全显示后停留毫秒数
var w3seah=0; ?与底部距离
var w3seaw=0; ?与最右边距离
var msg=" <span style=\"width:100%;font-weight:bold;color:#CCFFFF;font-size:22px;text-align: center;\">欢迎来到牛奶空间</span>"; ?内容
var temp=screen.height-30-picheight-w3seah;
var winstr="<div style=\"border:1 solid #000000;width:"+picwidth+";height:"+picheight+";background:url('"+picadd+"');\"><div style='height:444;line-height: "+picheight+"px;'>"+msg+"</div></div>";
oPopup.document.body.innerHTML = winstr;
popshow();
function popshow(){
if(popTop>=picheight+w3seah+w3seas){
clearTimeout(mytime);
oPopup.hide();
return;
}else if(popTop>=picheight+w3seah){
oPopup.show(screen.width-picwidth-w3seaw,screen.height-30-picheight-w3seah,picwidth,picheight);
}else if(popTop>=picheight){
oPopup.show(screen.width-picwidth-w3seaw,screen.height-30-popTop,picwidth,picheight);
}else if(popTop<picheight){
oPopup.show(screen.width-picwidth-w3seaw,screen.height,picwidth,popTop);
}
popTop+=1;
var mytime=setTimeout("popshow();",8);
}
</SCRIPT>
2005-11-22 14:59 | fengzi[未注册用户]

#9楼   回复  引用  查看    

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

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

#10楼   回复  引用  查看    

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

#11楼   回复  引用    

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

#12楼   回复  引用    

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

#13楼   回复  引用    

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

#14楼   回复  引用  查看    

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

#15楼   回复  引用  查看    

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

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

#16楼   回复  引用  查看    

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



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 95778




相关文章:

相关链接: