虽然通过标准的方式可以创建处理程序,但是实现的步骤比较复杂,为了方便网站开发中对于处理程序的应用,从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;
}
}
}
}