用ashx动态生成文件
用ashx动态生成文件 大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在服务器的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。突然发现这种用法讨论的很好,也许是没怎么详细介绍它的官方中文文档吧,并且推荐另外一种方法代替。
// ------------------------------------------------------------------------
// Pick your favorite image format
// ------------------------------------------------------------------------
byte[] byteArr = (byte[]) oChartSpace.GetPicture ('png', 500, 500);
// ------------------------------------------------------------------------
// Store the chart image in Session to be picked up by an HttpHandler later
// ------------------------------------------------------------------------
HttpContext ctx = HttpContext.Current;
string chartID = Guid.NewGuid ().ToString ();
ctx.Session [chartID] = byteArr;
imgHondaLineup.ImageUrl = string.Concat ('chart.ashx?', chartID);
chart.ashx里面就下面一句话
<% @ WebHandler language='C#' codebehind='chart.ashx.cs' %>
其实也可以用这个代替
在web.config里面的<system.web>里面加上
<httpHandlers>
<add verb='*' path='*.ashx' type='AspNetResources.Owc, ChartHandler ' validate='false' /> /*ChartHandler 是那个ashx.cs编译后生成的代码Assembly*/
<!--Since we are grabbing all requests after this, make sure Error.aspx does not rely on .Text -->
<add verb='*' path='Error.aspx' type='System.Web.UI.PageHandlerFactory' />
</httpHandlers>
具体使用哪个都无所谓,后一种配置好了就方便一些,不用管路径了,其实这个思想的应用比较知名的在.text里面就已经有了,只不过应用的方向不同。
ashx.cs文件的代码
using System;
using System.Web.SessionState;
using System.IO;
using System.Web;
namespace AspNetResources.Owc
{
public class ChartHandler : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest (HttpContext ctx)
{
string chartID = ctx.Request.QueryString[0];
Array arr = (Array) ctx.Session [chartID];
ctx.ClearError ();
ctx.Response.Expires = 0;
ctx.Response.Buffer = true;
ctx.Response.Clear ();
MemoryStream memStream = new MemoryStream ((byte[])arr);
memStream.WriteTo (ctx.Response.OutputStream);
memStream.Close ();
ctx.Response.ContentType = 'image/png';
ctx.Response.StatusCode = 200;
ctx.Response.End ();
}
}
}