ASP.NET 中的一般处理程序

   最近在学习ajax技术时看到一般处理程序(*.ashx),不知道是什么东西,于是各种查资料,下面是本人对一般处理程序的一些总结。

       我在创建网站时发现这个一般处理程序只可以在ASP.NET MVC中和web application中添加,而在创建website中缺不存在添加项。并且在web application中还可以添加处理程序,但是实现的步骤比较复杂,所以为了方便网站开发中对于处理程序的应用,从ASP.NET 2.0 开始,ASP.NET提供了称为一般处理程序的处理程序,允许我们使用比较简单的方式定义扩展名为ashx的专用处理程序。

[csharp] view plaincopy

 

  1. public class Handler1 : IHttpHandler  
  2.     {  
  3.   
  4.         public void ProcessRequest(HttpContext context)  
  5.         {  
  6.             context.Response.ContentType = "text/plain";  
  7.             context.Response.Write("Hello World");  
  8.         }  
  9.   
  10.         public bool IsReusable  
  11.         {  
  12.             get  
  13.             {  
  14.                 return false;  
  15.             }  
  16.         }  
  17.     }  

 从上面的代码可以看到,一般处理程序实际上就是一个处理程序类,这个处理程序被ASP.NET直接在系统的配置文件中映射到了ashx扩展名的请求上。这样,我们就不需要在配置文件中进行配置了。

  1. <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成为理想的数据交换语言。

[csharp] view plaincopy
  1. namespace ValidateCode  
  2. {  
  3.     public class Handler1 : IHttpHandler  
  4.     {  
  5.   
  6.         public void ProcessRequest(HttpContext context)  
  7.         {  
  8.             Random r = new Random();  
  9.             int a = r.Next(100, 10000);  
  10.             string json = string.Format("{{\"Number\":{0}}}",a);  
  11.   
  12.             context.Response.Cache.SetCacheability(HttpCacheability.NoCache);  
  13.             context.Response.ContentType = "application/json";  
  14.             context.Response.Write(json);  
  15.         }  
  16.   
  17.         public bool IsReusable  
  18.         {  
  19.             get  
  20.             {  
  21.                 return false;  
  22.             }  
  23.         }  
  24.     }  
  25. }  
[javascript] view plaincopy
  1. <div id="num">  
  2.   
  3. </div>  
  4.   
  5.   
  6.    <script type="text/javascript">  
  7.        var elemnumdiv = document.getElementById('num');  
  8.        function GetNumber() {  
  9.            var xhr;  
  10.            if (window.ActiveXObjet)  
  11.                xhr = new ActiveXObject("Microsoft.XMLHTTP");  
  12.            else  
  13.                xhr = new XMLHttpRequest();  
  14.            xhr.open("get""Handler1.ashx"false);  
  15.            xhr.send(null);  
  16.            if (xhr.readyState == 4) {  
  17.                if (xhr.status == 200)  
  18.                    var result = eval("(" + xhr.responseText + ")");  
  19.                elemnumdiv.innerHTML = result.Number;  
  20.            }  
  21.        }  
  22.        setInterval(GetNumber, 1000);  
  23. </script>  

         在ASP.NET 3.5之后,定义在命名空间System.Runtime.Serialization.Json中 DataContractJsonSerializer 可以帮助我们直接将一个对象格式化JSON,或者将一个JSON反序列化为一个 .NET中的对象实例。这样,实现起来可以更加简单。

[csharp] view plaincopy
    1. namespace WebApplication1  
    2. {  
    3.     public class Number  
    4.     {  
    5.         public int Number { getset; }  
    6.     }  
    7.   
    8.     public class Handler1 : IHttpHandler  
    9.     {  
    10.   
    11.         public void ProcessRequest(HttpContext context)  
    12.         {  
    13.             context.Response.Cache.SetCacheability(HttpCacheability.NoCache);  
    14.             context.Response.ContentType = "application/json";  
    15.             Random r = new Random();  
    16.             int a = r.Next(100, 10000);  
    17.             string json = string.Format("{{\"Number\":{0}}}", a);  
    18.   
    19.             System.Type type = typeof(Number);  
    20.   
    21.             System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =  
    22.                 new System.Runtime.Serialization.Json.DataContractJsonSerializer(type);  
    23.   
    24.             Number number = new Number();  
    25.             number.Number = a;  
    26.   
    27.             serializer.WriteObject(context.Response.OutputStream, number);  
    28.         }  
    29.   
    30.         public bool IsReusable  
    31.         {  
    32.             get  
    33.             {  
    34.                 return false;  
    35.             }  
    36.         }  
    37.     }  
    38. }  

 

posted @ 2012-05-13 22:17  PC疯子  阅读(924)  评论(0编辑  收藏  举报