1.引言
做ASP.net開發大部分時間是在動態輸出html檔案,通過<img src=xxx.jpg />串連靜態圖片檔案。所做的編程工作也大部分是在aspx檔案裡添加代碼。其實所作的就是完善Page類得衍生類別。因為所有的aspx對應的類都是繼承自Page。而Page類本身負責完成整個頁面生存周期的管理工作。但有時候,輸出並不需要複雜的html頁面,而是簡單的圖片,如驗證碼就是個非常典型的例子。
2請求執行流程與通用處理常式
HttpApplication根據web.cofig中處理常式的映射關係,根據url找到對應的實現了IHttpHandler的類,並執行個體化後,調用類的ProcessRequest()方法,完成渲染輸出。由於ASP.netWeb程式的大部分工作是輸出html,所以微軟已經設計好了一個實現了IHttpHandler介面的Page類來處理此項任務。而對於其他的輸出,片,壓縮檔,純文字,xls檔案等等,微軟沒有單獨提供處理常式,而是通過提供一種叫做“通用處理常式”的ashx來完成,微軟做的是已經把ashx檔案對應工作處理好了,我們只需要完成IHttpHandler的介面函數就可以了。
3輸出圖片的步驟
在VS2010中,右鍵網站項目,選擇添加新項-->一般處理常式,會增加一個.ashx檔案,內容如下:
<%@ WebHandler Language="C#" Class="Handler" %></p><p>using System;<br />using System.Web;</p><p>public class Handler : IHttpHandler {<br /> private HttpResponse Response;<br /> public void ProcessRequest (HttpContext context)<br /> {<br /> context.Response.ContentType="text/plain";<br /> context.Response.Write("Hello World");<br /> }</p><p> public bool IsReusable<br /> {<br /> get<br /> {<br /> return false;<br /> }<br /> }</p><p>}
可以看到,代碼中定義了一個Handler類,實現了IHttpHandler介面。我們需要做的就是完善ProcessRequest這個介面函數。下面代碼輸出一個簡單的矩形映像。
<%@ WebHandler Language="C#" Class="Handler" %></p><p>using System;<br />using System.Web;</p><p>public class Handler : IHttpHandler {<br /> private HttpResponse Response;<br /> public void ProcessRequest (HttpContext context)<br /> {<br /> context.Response.ContentType = "image/jpeg";<br /> System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 100);<br /> System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);<br /> //繪製<br /> g.Clear(System.Drawing.Color.Black);<br /> g.DrawRectangle(System.Drawing.Pens.Red, 0, 0, 50, 50);</p><p> g.Dispose();<br /> bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);<br /> bitmap.Dispose();<br /> }</p><p> public bool IsReusable<br /> {<br /> get<br /> {<br /> return false;<br /> }<br /> }</p><p>}
如果需要在其他html文檔中顯示動態產生的圖片,那麼只要在html文檔中加入如下代碼即可:
<img src="xxx.ashx" />
4 輸出其他類型
利用ashx(active server handler extend),我們可以實現輸出任何http協議規範中的文件類型。當然也包括html,如果你不想使用複雜的aspx,完全可以自己利用ashx完成簡單html的輸出任務。不過也就失去了Page類的生命週期管理的便利性,還是看具體要求來決定是否使用Page類(aspx)。