用ashx动态生成文件

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

大概去年九月的时候,做一个功能就是生成图片,当然有很多方法,生成图片放在服务器的某个目录下面,隔一段时间就删除,图还得自己画,嫌麻烦,结果找着这样一段代码,今天看到使用.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- 王朝網路 版權所有 導航