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