ASP.NET提供低層級的請求/響應 API,使開發人員能夠使用 .NET 架構類為傳入的 HTTP 要求提供服務。為此,開發人員需創作支援 System.Web.IHTTPHandler 介面和實現 ProcessRequest()方法的類。當處理 HTTP 要求不需要由進階別的 頁架構抽象化提供的服務時,處理常式通常很有用。處理常式的常用用途包括篩選器和類似 CGI 的應用程式,尤其是那些返回位元據的應用程式。
ASP.NET 收到的每個傳入 HTTP 要求最終由實現 IHTTPHandler 的類的特定執行個體來處理。IHttpHandlerFactory 提供了處理 IHttpHandler 執行個體 URL 請求的實際解析的結構。除了 ASP.NET 提供的預設 IHttpHandlerFactory 類外, 開發人員還可以選擇建立和註冊工廠以支援大量的請求解析和啟用方案。
從這段文字可以看出,當aspx頁面不涉及。net架構提 供的進階介面技術(如資料緩衝、狀態保持、Web表單控制項引用等等)時,且向用戶端輸出的不是複雜的HTML文本,特別是只向用戶端返回位元據( 片,聲音等)時,可以用一個。cs應用程式檔案(本文使用c#語言,如果是用VB或JScript,……)來替代,而該應用程式必須有一個實現 System.Web.IHTTPHandler 介面和並實現 ProcessRequest() 方法的類。一個簡單的例子如下:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ImageHander : IHttpHandler, IReadOnlySessionState
{
public void ProcessRequest(HttpContext context)
{
string ProcessID= context.Request.QueryString["ProcessID"];
if (!string.IsNullOrEmpty(ProcessID))
{
Array arr = (Array)context.Session[ProcessID];
context.ClearError();
context.Response.Expires = 0;
context.Response.Buffer = true;
context.Response.Clear();
MemoryStream memStream = new MemoryStream((byte[])arr);
memStream.WriteTo(context.Response.OutputStream);
memStream.Close();
context.Response.ContentType = "image/jpg";
context.Response.StatusCode = 200;
context.Response.End();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
頁面上調用:
int i = 1;
byte[] pictureData = GetPictureData(Server.MapPath("Images/Factorymethod.jpg"));
Session[i.ToString()] = pictureData;
this.Image1.ImageUrl = "ImageHander.ashx?ChartID="+i;
GetPictureData方法如下:
Code
public byte[] GetPictureData(string imagepath)
{
FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重載方法
byte[] byData = new byte[fs.Length];
fs.Read(byData, 0, byData.Length);
fs.Close();
return byData;
}
最後產生出來的效果就是在頁面上展示了Images下的Factorymethod.jpg。
另外一個例子:
namespace WebApplication1
{
/**//// <summary>
/// $codebehindclassname$ 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
/**////類必須實現IHttpHandler介面。如果程式將訪問工作階段狀態(Session),則必須實現 IRequiresSessionState 介面(不包含任何方法的標記介面)。*/
public class DLLHander : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
HttpResponse res = context.Response;
res.Write("<html><body>");
res.Write("<h1>DllHander處理</h1><hr>");
res.Write("本頁面直接由DLL處理");
res.Write("</html></body>");
}
public bool IsReusable
{
get
{
return true;
}
}
}
}
在設定檔web.config中添加aspx->dll映射,添加後,web.config應該是這樣子的:
<httpHandlers>
<add verb="*" path="Index.aspx" type="WebApplication1.DLLHander,WebApplication1"/>
</httpHandlers>
現在當瀏覽器訪問時這個地址時候 http://localhost/WebApplication1/index.aspx 實際上就是調用了WebApplication.dll中DLLHander類的ProcessRequest方法,在瀏覽中應該可以看到一個簡單的頁面。
最後希望朋友們提出問題,共同解決。謝謝!
Charles Chen
MSN: Charles.C.Chen@newegg.com
Email: gotosunny@msn.com