ASP.NET 中的一般处理程序
最近在学习ajax技术时看到一般处理程序(*.ashx),不知道是什么东西,于是各种查资料,下面是本人对一般处理程序的一些总结。
我在创建网站时发现这个一般处理程序只可以在ASP.NET MVC中和web application中添加,而在创建website中缺不存在添加项。并且在web application中还可以添加处理程序,但是实现的步骤比较复杂,所以为了方便网站开发中对于处理程序的应用,从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;
- }
- }
- }
- }