.ashx應用:
處理產生動態圖片、 產生動態文本等不需要回傳處理的任務
處理ajax請求
可以用ashx檔案建立web 服務。類似web servers 。比如傳輸json格式的資料
輕量的資訊互動都可以用這個,沒有aspx那麼複雜的生命週期
.ashx檔案有個缺點,他處理控制項的回傳事件非常麻煩,比如說如果用它來產生DataGrid的列表也不是不行,但是處理資料的回傳,需要一些.aspx頁的功能,只有自己手動處理這些功能。所以,一般使用.ashx,用來輸出一些不需要回傳處理的項目即可。
利用“一般處理常式”。如果你實用的是vs2005你在添加新項中可以見到“一般處理常式”,它的尾碼名為.ashx。它是什嗎?其實它和.aspx很類似。先問問.aspx是如何工作的?也許你知道,.aspx能處理來自外部傳入的請求,然後它還能處理這個請求並產生一個html作為結果返回。這是典型的處理外部請求的方式。.aspx就是專門為處理“典型”的請求而出現的。那麼如果我們現在需要一種又能處理外部請求又需要我們自訂的處理這個請求那又要怎麼做呢?(也就是不實用“典型”的方式來處理)。.ashx就能幫你做到這一點。
首先你發現 <%@ WebHandler Language="C#" Class="ImageHandler" %>這句話。想想一個ASP.NET的頁面是不是也有類似的東西。其實它表明了現在的這個檔案可以處理一個來自外部的請求。當然就它是不行的。
接下來關鍵的東西就是底下建立的類,它實現了一個關鍵的介面:IHttpHandler。實現這個介面表明你現在將以何種方式來處理來自外部的請求。其中有一個方法和屬性需要實現,你可以在ProcessRequest方法中編寫如何處理請求的細節而IsReusable表明其它的請求是否可以使用這個類的一個執行個體。我們可以暫時忽略IsReusable屬性。將焦點轉到ProcessRequest方法上。在ProcessRequest中有一個參數context它是一個HttpContext類型,context對象提供對用於為 HTTP 要求提供服務的內部伺服器對象(如 Request、Response、Session 和 Server)的引用。也就是可以訪問我們的幾大伺服器對象。
現在來看個簡單的例子。
請在你自己建立的WEB網站資料夾中隨便放一個圖片。我的想法是這樣,我先將一個圖片讀取成一個二進位的資料然後在將這個二進位的資料轉變成一個圖片。這其中需要你建立兩個檔案。一個.ASPX檔案和現在我們要實用的.ASHX檔案。
檔案ImageHandler.ashx
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.Web;
/// <summary>
/// 這就一個沒有任何實現的一般處理常式。
/// </summary>
public class ImageHandler : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
//擷取虛擬目錄的實體路徑。
string path = context.Server.MapPath("");
//擷取圖片檔案的位元據。
byte[] datas = System.IO.File.ReadAllBytes(path + "\\U1513.jpg");
//將位元據寫入到輸出資料流中。
context.Response.OutputStream.Write(datas, 0, datas.Length);
}
public bool IsReusable {
get {
return false;
}
}
}
default.aspx檔案
注意上面的代碼:<asp:Image ID="Image1" runat="server" ImageUrl="~/ImageHandler.ashx"/></div> 中ImageUrl指向的是ImageHandler.ashx檔案。