用ashx动态生成文件

发表于:2007-06-30来源:作者:点击数: 标签:
大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在 服务器 的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。突然发现这种
    
  大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在服务器的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.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#" class="AspNetResources.Owc.ChartHandler" 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 ();
  
   }
   }
  }
  
  

原文转自:http://www.ltesting.net