雖然通過標準的方式可以創建處理程序,但是實現的步驟比較複雜,爲了方便網站開發中對於處理程序的應用,從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;
}
}
}
}