1. 程式人生 > >用ashx動態生成檔案(轉載)

用ashx動態生成檔案(轉載)

//----------------------------------------
//Pickyourfavoriteimageformat
//------------------------------
byte[]byteArr=(byte[])oChartSpace.GetPicture("png",500,500);
//----------------------------------------
//StorethechartimageinSessiontobepickedupbyanHttpHandlerlater
//---------------------------------------
HttpContextctx=HttpContext.Current;
stringchartID=Guid.NewGuid().ToString();

ctx.Session[chartID]=byteArr;
imgHondaLineup.ImageUrl=string.Concat("chart.ashx?",chartID);

chart.ashx裡面就下面一句話

<%@WebHandlerlanguage="C#"class="AspNetResources.Owc.ChartHandler"codebehind="chart.ashx.cs"%>

其實也可以用這個代替

在web.config裡面的<system.web>裡面加上

<httpHandlers>
<addverb="*"path="*.ashx"type="AspNetResources.Owc,ChartHandler"validate="false"/>/*ChartHandler是那個ashx.cs編譯後生成的程式碼Assembly*/

<!--Sincewearegrabbingallrequestsafterthis,makesureError.aspxdoesnotrelyon.Text-->
<addverb="*"path="Error.aspx"type="System.Web.UI.PageHandlerFactory"/>

</httpHandlers>

具體使用哪個都無所謂,後一種配置好了就方便一些,不用管路徑了,其實這個思想的應用比較知名的在.text裡面就已經有了,只不過應用的方向不同。

ashx.cs檔案的程式碼

usingSystem;
usingSystem.Web.SessionState;
usingSystem.IO;
usingSystem.Web;

namespaceAspNetResources.Owc
{
publicclassChartHandler:IHttpHandler,IReadOnlySessionState
{
publicboolIsReusable
{
get{returntrue;}
}

publicvoidProcessRequest(HttpContextctx)
{
stringchartID=ctx.Request.QueryString[0];
Arrayarr=(Array)ctx.Session[chartID];

ctx.ClearError();
ctx.Response.Expires=0;
ctx.Response.Buffer=true;
ctx.Response.Clear();

MemoryStreammemStream=newMemoryStream((byte[])arr);
memStream.WriteTo(ctx.Response.OutputStream);
memStream.Close();

ctx.Response.ContentType="image/png";
ctx.Response.StatusCode=200;
ctx.Response.End();

}
}
}