当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 用ashx动态生成文件

ASP.NET
asp.net DiscuzNT登录,退出的代码
ASP .NET中执行控件(如ImageButton、LinkButton等)命令不刷新页面
Microsoft SQL Server 2005 Express 远程访问设置详述,100%成功篇
使用.NET命令行编译器编译项目(如ASP.NET、C#等)
asp.net 去除viewstate
asp.net repeater实现批量删除
asp.net安全、实用、简单的大容量存储过程分页
asp.net 获取图片高度和宽度实例代码
在GridView中LinkButton的属性的应用(如何不用选中就删除这一行)
关于.net(C#)中的跨进程访问的问题
asp.net request.PathInfo实现的url重写
asp.net SqlDataReader绑定Repeater
ASP.NET 动态写入服务器端控件
Discuz .net版本中的短消息系统
asp.net动态加载用户控件,关于后台添加、修改的思考
.net Cookies安全性实践分析
配置Visual Studio 以调试.net framework源代码
asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)
asp.net Web站点风格切换的实现
asp.net 用户控件中图片及样式问题

ASP.NET 中的 用ashx动态生成文件


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 195 ::
收藏到网摘: n/a

大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在服务器的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。突然发现这种用法讨论的很好,也许是没怎么详细介绍它的官方中文文档吧,并且推荐另外一种方法代替。

//----------------------------------------
//Pickyourfavoriteimageformat
//------------------------------
byte[]byteArr=(byte[])oChartSpace.GetPicture("png",500,500);
//----------------------------------------
//StorethechartimageinSessiontobepickedupbyanHttpHandlerlater
//---------------------------------------
HttpContextctx=HttpContext.Current;
stringchartID=Guid.NewGuid().ToString();

ctx.Session[chartID]=byteArr;
imgHondaLineup.ImageUrl=string.Concat("chart.ashx?",chartID);

chart.ashx里面就下面一句话

<%@WebHandlerlanguage="C#"class="AspNetResources.Owc.ChartHandler"codebehind="chart.ashx.cs"%>

其实也可以用这个代替

在web.config里面的<system.web>里面加上

<httpHandlers>
<addverb="*"path="*.ashx"type="AspNetResources.Owc,ChartHandler"validate="false"/>/*ChartHandler是那个ashx.cs编译后生成的代码Assembly*/

<!--Sincewearegrabbingallrequestsafterthis,makesureError.aspxdoesnotrelyon.Text-->
<addverb="*"path="Error.aspx"type="System.Web.UI.PageHandlerFactory"/>

</httpHandlers>

具体使用哪个都无所谓,后一种配置好了就方便一些,不用管路径了,其实这个思想的应用比较知名的在.text里面就已经有了,只不过应用的方向不同。

ashx.cs文件的代码

usingSystem;
usingSystem.Web.SessionState;
usingSystem.IO;
usingSystem.Web;

namespaceAspNetResources.Owc
{
publicclassChartHandler:IHttpHandler,IReadOnlySessionState
{
publicboolIsReusable
{
get{returntrue;}
}

publicvoidProcessRequest(HttpContextctx)
{
stringchartID=ctx.Request.QueryString[0];
Arrayarr=(Array)ctx.Session[chartID];

ctx.ClearError();
ctx.Response.Expires=0;
ctx.Response.Buffer=true;
ctx.Response.Clear();

MemoryStreammemStream=newMemoryStream((byte[])arr);
memStream.WriteTo(ctx.Response.OutputStream);
memStream.Close();

ctx.Response.ContentType="image/png";
ctx.Response.StatusCode=200;
ctx.Response.End();

}
}
}