你不想創(chuàng)建一個普通ASP.NET的Web窗體頁。而又要通過一個查詢字符串返回一個動態(tài)的圖片、XML或者非HTML網(wǎng)頁。這是一個用C#編程語言編寫的使用ASHX(一般處理程序)的簡單教程。
簡介
首先,我們來回顧一下使用ASHX文件的目的。也許我們想在URL中使用這個ASHX文件動態(tài)的返回數(shù)據(jù)內(nèi)容。我們使用的URL查詢字符串如下:
http://www.dotnetperls.com/?file=name.
入門:怎么添加一個ASHX文件呢?
打開你的ASP.NET網(wǎng)站,在網(wǎng)站上點擊"添加新項"的菜單,此時打開了"添加新項"窗口,選擇一般處理程序(Generic Handler),這時你將看到一個有一些代碼的Handler.ashx文件。
自動生成的代碼
我們注意到在ASHX文件中自動生成的代碼,定義了IHttpHandler接口的2個方法。最重要的方法是ProcessRequest(),無論是請求還是輸出,這個方法都會被調(diào)用到。你不應該修改任何默認繼承的接口成員。
URL映射
通常,使用一個新的URL替代舊的URL或者路徑是可行的。為了向后兼容和搜索引擎優(yōu)化,在你的網(wǎng)站上,你也許想用新的處理程序代替一個舊的URL地址。用URL映射可以解決此問題。當然,你也可以用更復雜的路徑重寫方法。
Web.config中的部分代碼
<system.web>
<urlMappings enabled="true">
<add url="~/Default.aspx" mappedUrl="~/Handler.ashx"/>
</urlMappings>
……..
</system.web>
以上代碼將自動將一個連接轉(zhuǎn)到另一個上面。當Default.aspx頁面被請求時,Handler.ashx文件將取而代之。這意味著:你的目錄默認頁面將自動導航到一般處理程序上。
添加示例圖片
在這里,你也許會用ASHX文件處理圖片文件。在桌面或者網(wǎng)絡(luò)上找一會你最喜歡的圖片,把它添加到你的項目中。例如,我選擇的圖片是"Flower1.png",下面我將在ASHX文件中使用這個圖片。
修改Handler.ASHX文件
你的Handler有2個方法,我們必須修改ProcessRequest()方法,可以修改文件的ContentType和輸出內(nèi)容。通過下面類似的代碼可以修改你的圖片文件名和ContentType屬性。
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/png";
context.Response.WriteFile("~/images/ Flower1.png");
}
public bool IsReusable
{
get
{
return false;
}
}
測試處理程序
在本地測試ASHX文件。點擊網(wǎng)站綠色的運行按鈕。你將在瀏覽器上看到你的圖片文件。這是處理程序中輸出的圖片返回結(jié)果。
添加功能
到目前位置,上面的例子是沒有任何作用的。主要就是讓我們通過ASHX處理一個圖片文件。你可以在ASHX文件添加任何邏輯代碼或者邏輯引用。開發(fā)者通常需要使用請求的查詢字符串集合。你可以像在ASPX文件中使用的方法一樣請求查詢字符串:Request.QueryString["file"]。
上面的代碼通過基于查詢字符串集合,收到請求然后返回不同的圖片文件。他將通過查詢字符串返回二個圖片中的一個。
例如:
URL = http://www.dotnetperls.com/?file=logo
File query string: logo
File written: Logo1.png
URL = http://www.dotnetperls.com/?file=flower
File query string: flower
File written: Flower1.png
測試查詢字符串
做了這么多準備工作。開始測試吧!打開你的瀏覽器,在URL路徑上添加上面的查詢字符串。你會看到ASP.NET由Default.aspx頁面導航到Handler.ashx頁面。并且,他將通過獲取查詢變量返回適當?shù)奈募?div style="height:15px;">
用途
這些代碼可以用作訪問者數(shù)量的計數(shù)器或者日志推薦的數(shù)量計數(shù)器。由于瀏覽器和Bot的區(qū)別,這將比服務(wù)器日志提供更準確的訪問數(shù)量。
性能
你也許想知道,使用ASHX文件,是否會帶來一些性能的優(yōu)勢或改變呢?ASHX文件并不復雜,而且不涉及更多事件的調(diào)用。正如你想象的那樣,一個請求處理10幾個事件比處理一個事件將消耗更多的性能。所以,在可能的情況下使用ASHX文件吧,他將會帶來一些性能的優(yōu)勢。
選擇處理程序
那什么時候用客戶端處理程序,什么時候使用Web窗體文件呢?一般處理程序在處理二進制數(shù)據(jù)更有優(yōu)勢,而Web窗體在做快速開發(fā)方面更好。
控制樹
在ASP.NET框架中,Web窗體使用一種稱為控制樹的概念(網(wǎng)頁都保存在一個對象模型中)。當你不需要客戶端的控制樹或者整個網(wǎng)站架構(gòu)的時候,使用一般處理程序,這將會帶來更好的性能優(yōu)勢和簡單的代碼調(diào)試。
IsReusable 屬性
我不知道IsReusable屬性在ASP.NET中的作用。通過閱讀表名,他能在不破壞反復程序處理的情況下提高性能、減少內(nèi)存壓力。
總結(jié)
在這篇文章中,教給你怎么在自己的網(wǎng)站中使用ASHX自定義處理程序。通過修改后,能填充到更多重要的網(wǎng)站中。結(jié)合自定義查詢字符串的URL映射,可以大大簡化和優(yōu)化你的網(wǎng)站后臺代碼。
附加:
做好一個.aspx頁面。
[html]
view plaincopyprint?<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div>
<img id="img" src="images/1.jpg" height="300px" />
</div>
<a href="#" onclick="GetImg(1)">1</a>
<a href="#" onclick="GetImg(2)">2</a>
<a href="#" onclick="GetImg(3)">3</a>
</div>
</form>
</body>
</html>
<script type="text/javascript">
function GetImg(index) {
var myImg = document.getElementById('img');
myImg.src = './imageHandle.ashx?id=' + index;
}
</script>
這個例子是這樣的,有三個鏈接,分別為1、2、3,點擊后顯示對應的圖片。