asp.net實現頁面的一般處理程式(CGI)學習筆記

iDotNetSpace發表於2009-02-17

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
{
    /**////


    /// $codebehindclassname$ 的摘要說明
    ///

    [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("

");
            res.Write("

DllHander處理


");
            res.Write("本頁面直接由DLL處理");
            res.Write("");
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}
在配置檔案web.config中新增aspx->dll對映,新增後,web.config應該是這樣子的:
 
       
     

 現在當瀏覽器訪問時這個地址時候 http://localhost/WebApplication1/index.aspx 實際上就是呼叫了WebApplication.dll中DLLHander類的ProcessRequest方法,在瀏覽中應該可以看到一個簡單的頁面。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-553567/,如需轉載,請註明出處,否則將追究法律責任。

相關文章