大概去年九月的時候,做一個功能就是生成圖片,當然有很多方法,生成圖片放在伺服器的某個目錄下面,隔一段時間就刪除,圖還得自己畫,嫌麻煩,結果找著這樣一段程式碼,今天看到使用.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 ();
}
}
}