《ASP.NET本質論》一般處理程序

    雖然通過標準的方式可以創建處理程序,但是實現的步驟比較複雜,爲了方便網站開發中對於處理程序的應用,從ASP.NET 2.0 開始,ASP.NET提供了稱爲 一般處理程序 的處理程序,允許我們使用比較簡單的方式定義擴展名爲ashx的專用處理程序。

public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

從上面的代碼可以看到,一般處理程序實際上就是一個處理程序類,這個處理程序被ASP.NET直接在系統的配置文件中映射到了ashx擴展名的請求上。這樣,我們就不需要在配置文件中進行配置了。
           <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />

   一般處理程序工廠
      通過配置文件,我們可以看到,對於擴展名爲ashx的請求是通過定義在命名空間System.Web.UI下的SimpleHandlerFactory處理程序工廠來完成的。
     當請求一個ashx擴展名的服務器上的資源的時候,SimpleHandlerFactory將找到對應的ashx文件,通過這個文件找到對應的處理程序,最後SimpleHandlerFactory通過反射創建一個此類型的處理程序實例對象,比通過 GetHandler方法返回給HttpApplication,完成最終的請求處理過程。

        使用一般處理程序的場合
        對於ASP.NET網站來說,網站最常見的處理結果就是HTML網頁,生成網頁的工作通常使用擴展名爲aspx的Web窗體來完成。對於處理結果不是HTML的請求,都可以通過一般處理程序完成。例如生成 RSS Feed 、 XML 、圖片等。
       一般處理程序是ASP.NET 網站中最爲簡單、高效的處理程序,在處理返回類型不是HTML的請求中有着重要的作用。

       使用一般處理程序生產JSON
        在AJAX程序中,經常需要向瀏覽器返回JSON格式的數據結果,JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於人閱讀和編寫,同時也易於機器解析和生產。JSON 採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣,這些特性使JSON成爲理想的數據交換語言。

namespace ValidateCode
{
    public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            Random r = new Random();
            int a = r.Next(100, 10000);
            string json = string.Format("{{\"Number\":{0}}}",a);

            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.ContentType = "application/json";
            context.Response.Write(json);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

    <div id="num">
    
    </div>
    
    
       <script type="text/javascript">
           var elemnumdiv = document.getElementById('num');
           function GetNumber() {
               var xhr;
               if (window.ActiveXObjet)
                   xhr = new ActiveXObject("Microsoft.XMLHTTP");
               else
                   xhr = new XMLHttpRequest();
               xhr.open("get", "Handler1.ashx", false);
               xhr.send(null);
               if (xhr.readyState == 4) {
                   if (xhr.status == 200)
                       var result = eval("(" + xhr.responseText + ")");
                   elemnumdiv.innerHTML = result.Number;
               }
           }
           setInterval(GetNumber, 1000);
    </script>

         在ASP.NET 3.5之後,定義在命名空間System.Runtime.Serialization.Json中 DataContractJsonSerializer 可以幫助我們直接將一個對象格式化JSON,或者將一個JSON反序列化爲一個 .NET中的對象實例。這樣,實現起來可以更加簡單。

namespace WebApplication1
{
    public class Number
    {
        public int Number { get; set; }
    }

    public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.ContentType = "application/json";
            Random r = new Random();
            int a = r.Next(100, 10000);
            string json = string.Format("{{\"Number\":{0}}}", a);

            System.Type type = typeof(Number);

            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
                new System.Runtime.Serialization.Json.DataContractJsonSerializer(type);

            Number number = new Number();
            number.Number = a;

            serializer.WriteObject(context.Response.OutputStream, number);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章