我能得到什嗎?
看過《實戰 HTTP 處理常式(HTTP Handler)》系列的全部文章後,您就可以
- 輕鬆建立您自己的自訂 HTTP 處理常式
- 讓您的HTTP 處理常式與Web程式共用Session
- 讓動態產生的圖片直接顯示在Web頁面上,而不需要臨時檔案的中轉。
- 將動態產生的PDF檔案直接發送到Client端,而不需要臨時檔案的中轉。
什麼是 HTTP 處理常式?
您一定用過RDLC報表吧?如果您曾經在RDLC報表中的圖表上右擊,並選擇“屬性”的話,您就會發現RDLC報表的圖表
- 是一張(動態產生的)圖片
- 圖片的地址有點怪,並不是“某某檔案夾\某某圖片檔案”,而是類似於“Reserved.ReportViewerWebControl.axd?Mode=true&ReportID=e1eab20aaba...”這樣的類似於向某個頁面發送的Request。如所示
可是我們的網站上並沒有名為 ReportViewerWebControl.axd 的頁面呀。沒錯,ReportViewerWebControl.axd 並不是一個頁面,它是一個 HTTP Handler--同頁面一樣可以接受訪問請求並進行應答,但是比頁面更“底層”,--意味著更靈活的HTTP處理常式。如果您想瞭解更為詳細的關於HTTP Handler的知識,可以看黃忠成的這篇Inside ASP.NET 2.0-即時編譯系統,非常的精彩。如果您跟筆者一樣沒耐心且不求甚解,就直接Follow me,用10分鐘時間建立一個自訂的HTTP Handler。
建立一個最簡單的 HTTP Handler
Step1:在VS2005中,建立一個Web應用程式。
Step2:建立一個類庫,設定命名空間為“mylib.system.web”,這個命名空間可以根據您的需要設定為其它的值。
具體方法是開啟“方案總管”,在“解絕方案 HTTPHandlerDemo”上右擊,選擇“添加->建立項目...”,然後選擇“類庫”。
注意,如果您在第一步建立的是VB的Web程式,那麼在“方案總管”中可能不會顯示“解絕方案 HTTPHandlerDemo”,這時您可以通過菜單“檔案->添加...->建立項目...->類庫”的方法來建立類庫。
Step3:為建立的類庫添加對“System.Web”的引用。
Step4:建立一個名為“MyHandler”的類。同樣,這個類名是隨便起的。
Step5: 修改MyHandle類,讓它能夠向用戶端輸出一些資訊。MyHandler.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace mylib.system.web
{
public class MyHandler : System.Web.IHttpHandler
{
#region IHttpHandler 成員
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(System.Web.HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.Write("<html><body>Hello!</body></html>");
}
#endregion
}
}
Step6:為Step1中建立的Web應用程式“HTTPHandlerDemo”添加對類庫“mylib.system.web”的引用
Step7:修改Step1中建立的Web應用程式的Web.config檔案,在“system.web”節裡面添加一行“httpHandlers”標記,如下面代碼所示(塗上綠色背景的部分)。注意我寫的“path="MyHandler.jxd"”。為什麼副檔名是“jxd”呢?因為我姓景嘛,所以是“jxd”,如果你姓王,就可以叫“MyHandler.wxd”。
“Web.config”沒有顯示在“解決方案管理器”裡?最簡單的方法是按一下“F5”運行一下程式,在隨後彈出的“是否修改Web.config”的對話方塊上按“確定”按鈕。Web.config
<?xml version="1.0"?>
<!--
注意: 除了手動編輯此檔案以外,您還可以使用
Web 管理工具來配置應用程式的設定。可以使用 Visual Studio 中的
“網站”->“Asp.Net 配置”選項。
設定和注釋的完整列表在
machine.config.comments 中,該檔案通常位於
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<httpHandlers>
<add path="MyHandler.jxd" verb="*" type="mylib.system.web.MyHandler, mylib.system.web"
validate="false" />
</httpHandlers>
<!--
設定 compilation debug="true" 將偵錯符號插入
已編譯的頁面中。但由於這會
影響效能,因此只在開發過程中將此值
設定為 true。
-->
<compilation debug="true"/>
<!--
通過 <authentication> 節可以配置 ASP.NET 使用的
安全身分識別驗證模式,
以標識傳入的使用者。
-->
<authentication mode="Windows"/>
<!--
如果在執行請求的過程中出現未處理的錯誤,
則通過 <customErrors> 節可以配置相應的處理步驟。具體說來,
開發人員通過該節可以配置
要顯示的 html 錯誤頁
以代替錯誤堆疊追蹤。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
Step8:測試。按F5運行程式,在IE地址欄中手動將地址改成“/HttpHandlerDemo/MyHandler.jxd”,按下斷行符號鍵,即可看到頁面上顯示的“Hello!”了。
Step9:修改Web應用程式的“Default.aspx”頁面,添加一個IFrame標記,顯示MyHandler.jxd中的內容。Default.aspx
<%@ 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>
<iframe src='~/MyHandler.jxd'></iframe>
</div>
</form>
</body>
</html>
將Default.aspx設為起始頁,按F5運行程式,就可以看到IFrame中的“Hello!”了。
Step10:發布程式,配置IIS。將Web應用程式發布,然後在IIS中建立虛擬目錄後,瀏覽 Default.aspx 時會發現IFrame 裡顯示“找不到網頁”的錯誤資訊。這是因為IIS不知道使用哪個程式處理副檔名為“jxd”的訪問請求。請按下面的步驟添加應用程式對應。
首先開啟IIS,在虛擬目錄上右擊,選擇“屬性”。
然後點擊“配置...”按鈕。在“應用程式配置”頁添加一個“.jxd”與可執行檔的映射。“可執行檔”欄可以模仿“.axd”的“可執行檔”欄來填寫。
下載本篇全部原始碼
本篇到此結束。下一篇將介紹向MyHandler.jxd 傳遞參數的方法。
本系列共6篇文章
實戰 HTTP 處理常式(HTTP Handler) (6)——條碼隨意打
實戰 HTTP 處理常式(HTTP Handler) (5)——不用臨時檔案,直接開啟動態產生的檔案
實戰 HTTP 處理常式(HTTP Handler) (4)——與Web程式共用Session
實戰 HTTP 處理常式(HTTP Handler) (3)——動態產生圖片
實戰 HTTP 處理常式(HTTP Handler) (2)——向HTTP 處理常式傳遞參數
實戰 HTTP 處理常式(HTTP Handler) (1)——建立一個最簡單的 HTTP Handler <- you are here.