用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里面就下面一句话

1 @ WebHandler language="C#" class="AspNetResources.Owc.ChartHandler" codebehind="chart.ashx.cs" 

其实也可以用这个代替

在web.config里面的

 1<system.web>里面加上 
 2
 3<httphandlers>
 4<add path="*.ashx" type="AspNetResources.Owc, ChartHandler " validate="false" verb="*"></add> /*ChartHandler 是那个ashx.cs编译后生成的代码Assembly*/   
 5  
 6<!--Since we are grabbing all requests after this, make sure Error.aspx does not rely on .Text -->
 7<add path="Error.aspx" type="System.Web.UI.PageHandlerFactory" verb="*"></add>
 8</httphandlers>
 9
10具体使用哪个都无所谓,后一种配置好了就方便一些,不用管路径了,其实这个思想的应用比较知名的在.text里面就已经有了,只不过应用的方向不同。 
11
12ashx.cs文件的代码 
13
14using System;   
15using System.Web.SessionState;   
16using System.IO;   
17using System.Web; 
18
19namespace AspNetResources.Owc   
20{   
21public class ChartHandler : IHttpHandler, IReadOnlySessionState   
22{   
23public bool IsReusable   
24{   
25get { return true; }   
26}   
27  
28public void ProcessRequest (HttpContext ctx)   
29{   
30string chartID = ctx.Request.QueryString[0];   
31Array arr = (Array) ctx.Session [chartID]; 
32
33ctx.ClearError ();   
34ctx.Response.Expires = 0;   
35ctx.Response.Buffer = true;   
36ctx.Response.Clear (); 
37
38MemoryStream memStream = new MemoryStream ((byte[])arr);   
39memStream.WriteTo (ctx.Response.OutputStream);   
40memStream.Close (); 
41
42ctx.Response.ContentType = "image/png";   
43ctx.Response.StatusCode = 200;   
44ctx.Response.End (); 
45
46}   
47}   
48}</system.web>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus