用ashx动态生成文件

用ashx动态生成文件


作者: AspCool  &;nbsp来自:网络


               
  大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在服务器的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.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 ();
 
          }
      }
  }
 
    (2005-5-18:08:41)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Asp.Net] 的这些文章也感兴趣:

利用ASP.NET的内置功能抵御Web攻击
ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
Asp.Net附件上传大小限制控制
ASP.NET 2.0 中跨网页提交的方法集合
关于 IE 模态对话框的两个问题
Asp.net Mvc Preview 5 体验:ActionSelectionAttribute
Duwamish7初探——数据流程
利用C#制作简单的留言板
利用HttpHandler实现验证码
使用ASP.NET 2.0提供的WebResource管理资源