熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在 ASP.NET 中執行 URL 重寫

2013-11-13 10:04:30  來源: .NET編程 

  
  引言
  讓我們花點時間來看一下網站上的一些 URL您是否發現一些類似於 x?EmpID=&type=summary 的 URL?或者您可能將一系列網頁從一個目錄或網站移動到另一個目錄或網站結果導致已將舊 URL 用作書簽的訪問者斷開鏈接在本文中我們將了解如何通過將 x?EmpID=&type=summary 替換為類似於 的網址使用 URL 重寫將那些冗長的 URL 縮寫為富有意義且容易記憶的 URL我們還將了解如何將 URL 重寫用於創建智能 錯誤
  
  URL 重寫是截取傳入 Web 請求並自動將請求重定向到其他資源的過程執行 URL 重寫時通常會檢查被請求的 URL並基於 URL 的值將請求重定向到其他 URL例如在進行網站重組而將 /people/ 目錄下的所有網頁移動到 /info/employees/ 目錄中時您可能希望使用 URL 重寫來檢查 Web 請求是否指向了 /people/ 目錄中的文件如果請求指向 /people/ 目錄中的文件您可能希望自動將請求重定向到 /info/employees/ 目錄中的同一文件
  
  使用傳統的 ASP應用 URL 重寫的唯一方法是編寫 ISAPI 篩選器或者購買提供 URL 重寫功能的第三方產品但是使用 Microsoft® ASPNET您可以通過很多方法來輕松地創建您自己的 URL 重寫軟件本文討論了可供 ASPNET 開發人員實現 URL 重寫的各種技術然後討論了 URL 重寫的一些實際使用情況在深入討論 URL 重寫的技術細節之前讓我們先看一些可以使用 URL 重寫的日常情景
  
  URL 重寫的常見用法
  創建數據驅動的 ASPNET 網站時通常會產生一個單個的網頁該網頁基於查詢字符串參數顯示數據庫數據的子集例如在設計電子商務站點時您的任務之一便是允許用戶浏覽待售產品為此您可以創建一個名為 displayCategoryaspx 的頁面該頁面將顯示給定類別的產品可以通過查詢字符串參數來指定要查看的該類別的產品也就是說如果用戶要浏覽待售的 Widget 產品並且所有 Widget 產品的 CategoryID 均為 則用戶可以訪問以下網址x?CategoryID=
  
  創建具有此類 URL 的網站有兩點不足首先從最終用戶的角度考慮URL x?CategoryID= 比較雜亂可用性專家 Jakob Neilsen建議遵循以下標准來選擇 URL
  
  &#; 簡短
  
  &#; 易於鍵入
  
  &#; 可以看出站點的結構
  
  &#; 可刪節允許用戶通過刪除 URL 的組成部分來浏覽站點
  
  
  我還要增加一條標准URL 應該便於記憶URL x?CategoryID= 不符合 Neilsen 的任何標准也不容易記住要求用戶鍵入查詢字符串值將使 URL 的鍵入變得非常困難並且只有了解查詢字符串參數的用途及其名稱/值對結構的富有經驗的 Web 開發人員才能夠對 URL 進行刪節
  
  較好的方法是允許使用切合實際且容易記憶的 URL只要看一眼 URL您便可以推斷出將要顯示的內容 有關 Widget 的信息此 URL 也很容易記住和共享我可以告訴我的同事請查看 /products/Widgets她可能無需再次問我 URL 是什麼即可打開該頁面(嘗試一下您只需說出 頁面即可!)此 URL 還將顯示出來並且應該是可刪節也就是說如果用戶刪去 URL 的末端鍵入 他們應該看到所有產品的列表或者至少應該看到他們可以查看的所有類別的產品列表
  
  注意要獲得可刪節URL 的最好示例可考慮使用由許多 blog 引擎生成的 URL要查看 日的帖子用戶可以訪問諸如 的 URL如果該 URL 被刪節為 用戶將看到 月的所有帖子將該 URL 進一步刪節為 將顯示 年的所有帖子
  
  除了簡化 URL 之外URL 重寫還經常用於處理網站重組以免導致大量鏈接斷開或書簽過期
  
  請求到達 IIS 時將會發生什麼情況
  在正式研究 URL 如何實現重寫之前應首先了解 Microsoft® Internet Information Services (IIS) 如何處理傳入請求這一點非常重要當請求到達 IIS Web 服務器時IIS 檢查被請求文件的擴展名以確定如何處理該請求IIS 可以自行處理請求(如 HTML 頁面圖像以及其他靜態內容)或者將請求路由到 ISAPI 擴展(ISAPI 擴展是一個處理傳入 Web 請求的非托管編譯類其任務是生成被請求資源的內容
  
  例如當傳入針對 Infoasp 網頁的請求時IIS 會將此消息路由到 aspdll ISAPI 擴展然後該 ISAPI 擴展將加載被請求的 ASP 頁面執行該頁面並將所呈現的 HTML 返回給 IIS然後IIS 將該 HTML 發送回請求客戶端對於 ASPNET 頁面IIS 會將此消息路由到 aspnet_isapidll ISAPI 擴展然後aspnet_isapidll ISAPI 擴展將處理操作傳遞給托管的 ASPNET 輔助進程該輔助程序將處理請求並返回 ASPNET 網頁的呈現 HTML
  
  您可以自定義 IIS以指定擴展名與 ISAPI 擴展的映射關系 顯示了 Internet Information Services 管理工具的應用程序配置對話框請注意與 ASPNET 有關的擴展名(aspxascxconfigasmxremcsvb 及其他)均已映射到 aspnet_isapidll ISAPI 擴展
  
  
 

  
已配置的文件擴展名映射

  
  討論 IIS 如何管理傳入請求稍稍超出了本文范圍但是可以在 Michele Leroux Bustamante 的文章 Inside IIS and ASPNET 中找到對此內容的深入討論ASPNET 引擎僅處理那些擴展名已明確映射至 IIS 中的 aspnet_isapidll 的傳入 Web 請求了解這一點非常重要
  
  <b>使用 ISAPI 篩選器檢查請求</b>
  IIS 除了可以將傳入 Web 請求的文件擴展名映射到相應的 ISAPI 擴展之外還將執行許多其他任務例如IIS 將嘗試對發出請求的用戶進行身份驗證並確定通過身份驗證的用戶是否有權限訪問被請求的文件在處理請求的有效期內IIS 將經歷幾個狀態在每個狀態下IIS 都將引發可以使用 ISAPI 篩選器以編程方式進行處理的事件
  
  與 ISAPI 擴展一樣ISAPI 篩選器是在 Web 服務器上安裝的非托管代碼塊ISAPI 擴展被設計為可以響應針對特定文件類型的請求另一方面ISAPI 篩選器還包含可以對 IIS 引發的事件進行響應的代碼ISAPI 篩選器可以截取甚至修改傳入和傳出的數據ISAPI 篩選器可以應用於很多方面包括
  
  &#; 身份驗證和授權
  
  &#; 記錄和監視
  
  &#; HTTP 壓縮
  
  &#; URL 重寫
  
  雖然 ISAPI 篩選器可用於執行 URL 重寫但本文將討論如何使用 ASPNET 實現 URL 重寫不過我們將對使用 ISAPI 篩選器與使用 ASPNET 中的技術實現 URL 重寫進行權衡
  
  請求進入 ASPNET 引擎時將會發生什麼情況
  在 ASPNET 之前需要使用 ISAPI 篩選器來實現 IIS Web 服務器上的 URL 重寫由於 ASPNET 引擎與 IIS 非常相似因此可以使用 ASPNET 進行 URL 重寫存在相似之處的原因在於 ASPNET 引擎可以實現以下功能
  
  &#; 在處理請求時可以引發事件
  
  &#; 允許任意數量的 HTTP 模塊處理所引發的事件這與 IIS 的 ISAPI 篩選器相似
  
  &#; 將呈現被請求資源這項任務委托給 HTTP 處理程序該處理程序與 IIS 的 ISAPI 擴展相似
  
  與 IIS 一樣ASPNET 引擎在請求的有效期內將會觸發事件通過發信號來表示其處理過程從一個狀態改變為了另一個狀態例如當 ASPNET 引擎首次響應請求時BeginRequest 事件將被觸發接下來觸發的是 AuthenticateRequest 事件該事件在已建立用戶標識時出現(此外還有大量的其他事件AuthorizeRequestResolveRequestCache 和 EndRequest等等這些事件屬於 SystemWebHttpApplication 類有關詳細信息請參閱位於以下網址的技術文檔HttpApplication Class Overview
  
  正如上一部分所討論的可以創建 ISAPI 篩選器以響應 IIS 引發的事件同樣ASPNET 提供了 HTTP 模塊該模塊可以響應由 ASPNET 引擎引發的事件可以將 ASPNET Web 應用程序配置為具有多個 HTTP 模塊對於由 ASPNET 引擎處理的每個請求將初始化每個已配置的 HTTP 模塊並允許將事件處理程序綁定到處理請求期間所引發的事件請注意對每個請求均使用了許多內置 HTTP 模塊其中的一個內置 HTTP 模塊是 FormsAuthenticationModule該模塊首先檢查是否使用了窗體身份驗證如果使用將檢查是否對用戶進行了身份驗證如果沒有使用會自動將用戶重定向到指定的登錄頁面
  
  如上所述通過使用 IIS傳入請求將最終發送給 ISAPI 擴展而 ISAPI 擴展的任務是返回特定請求的數據例如在請求傳統的 ASP 網頁時IIS 將請求傳遞給 aspdll ISAPI 擴展該擴展的任務是返回被請求的 ASP 頁面的 HTML 標記ASPNET 引擎使用相似的方法初始化 HTTP 模塊後ASPNET 引擎的下一項任務是確定應由哪個 HTTP 處理程序來處理請求
  
  所有通過 ASPNET 引擎傳遞的請求最終都將到達 HTTP 處理
From:http://tw.wingwit.com/Article/program/net/201311/12477.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.