《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;
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值