閱讀717 返回首頁    go 京東網上商城


初識ASP.NET---一般處理程序

       問題來源:

       今天在敲一個小的demo,利用Jquery實現級聯下拉框,敲的過程中發現無論怎麼和源碼對照都無法顯示想要的功能。這才想著原來是沒有寫後台代碼,詢問一清同學的時候,他告訴我可以利用ASP.NET的一般處理程序。

       我果然是菜鳥初學者,因為我還沒有接觸過一般處理程序!

       什麼是一般處理程序:

       一般處理程序:是一個實現System.Web.IHttpHandler接口的特殊類。任何一個實現了IHttpHandler接口的類,是作為一個外部請求的目標程序的前提。(凡是沒有實現此接口的類,就不能被瀏覽器請求。)它由支持ASP.NET的服務器調用和啟動運行。 一個HttpHandler程序負責處理它所對應的一個或一組URL地址的訪問請求,並接收客戶端發出的訪問請求信息(請求報文)和產生響應內容(響應報文)。

       優點:輕量化、效率較高

       創建一個一般處理程序將會生成兩個後綴名的文件.ashx和.ashx.cs。ashx裏隻有一個指令集,沒有任何其他代碼;ashx.cs就是頁麵處理代碼。如果有大量html,需要通過ashx來拚接字符串或讀取模板的方式完成。其中.ashx.cs對應的內容,如以下代碼:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
  
namespace web  
{  
    /// <summary>  
    /// Handler 的摘要說明  
    /// </summary>  
    public class Handler : IHttpHandler  
    {  
        public void ProcessRequest(HttpContext context)  
        {  
            context.Response.ContentType = "text/plain";  //表示輸出結果類型
            context.Response.Write("Hello World");  //輸出結果
        }  
  
        public bool IsReusable  
        {  
            get  
            {  
                return false;  
            }  
        }  
    }  
}  

(1)HttpContext: 請求上下文對象,包含:請求報文對象(HttpRequest),響應報文對象(HttpResponse),服務器幫助類(Server),Session等。

(2)FrameWork在接收到請求後,通過反射技術創建請求路徑對應的類的對象,並強製轉換成IHttpHandler接口對象(HttpHandler實現了IHttpHandler,之後的轉換相當於將子類強轉為父類),統一調用ProcessRequest方法處理。
(3)IsReusable屬性用來表示在IHttpHandlerFactory對象創建IHttpHandler的時候是否能夠將這個Handler存入池中以便重用。

(4)ContentTyp屬性是一般處理程序輸出響應內容,輸出的內容有可能是圖片、html等其他頁麵,瀏覽器根據響應報文體內容不知道接收到的是什麼,需要判斷響應報文頭裏的ContentType來決定將報文體內容作為何種格式的數據來顯示。(image/jpeg----表示輸出的是圖片,text/plain--------表示輸出文本)

 

       從上麵的代碼可以看到,一般處理程序實際上就是一個實現IHttpHandler接口的處理程序類,這個處理程序被ASP.NET直接在係統配置文件映射到了ashx擴展名的請求上。這樣,我們就不需要在配置文件中進行配置了。

       具體的用途:

       HttpHandler程序可以完成普通類程序所能完成的大多數任務:

           1.獲取客戶端通過HTML的Form表單提交的數據和URL參數

           2.創建對客戶端的響應消息內容

           3.訪問服務器端的文件係統

           4.連接數據庫並開發基於數據庫的應用

           5.調用其他類

 

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
  
namespace web  
{  
    /// <summary>  
    /// Handler 的摘要說明  
    /// </summary>  
    public class Handler : IHttpHandler  
    {  
        public void ProcessRequest(HttpContext context)  
        {  
            context.Response.ContentType = "text/plain";  //表示輸出結果類型
            context.Response.Write("Hello World");  //輸出結果
        }  
  
        public bool IsReusable  
        {  
            get  
            {  
                return false;  
            }  
        }  
    }  
}  

       具體的運用:

       下麵是利用Jquery實現級聯下拉框效果中,需要用一般處理程序獲得汽車類型的一般處理程序的代碼。

 public class Handler1 : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string strCarName =context.Request["carnameValue"].ToString();
 
            SqlConnection conn = new SqlConnection("server=.;database=car;uid=sa;pwd=123456;");   //定義連接字符串
            conn.Open();     //打開連接
            SqlDataAdapter sdr = new SqlDataAdapter();
            sdr.SelectCommand =new SqlCommand ("selectid,cartype from t_cartype where carnameid='" + strCarName + "'",conn);
 
            DataTable dt = new DataTable();
 
            sdr.Fill(dt);
            string str =DataTableToJson("1", dt);
            context.Response.Write(str);
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
}

        總結:

       其實理論知識再好不會用也隻會停留在理論層麵。而編程又是這麼奇怪的一個東西無論別人講得多麼的詳細,都比不上自己的一次實踐。文中所提到的demo源碼,文章最後會附有下載鏈接。

 

demo源碼下載:https://download.csdn.net/detail/senior_lee/7697243

最後更新:2017-04-03 05:39:36

  上一篇:go nfc開發
  下一篇:go 一首寫不完的詩