首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

UrlRewriter.NET 2.0 常見問題與解決:Object moved 錯誤、PostBack URL 修正、FormRewriterControlAdapter 建構函數補丁

     編輯:關於ASP.NET

UrlRewriter.NET 是開源 URL 重寫庫,支援 .NET 2.0。實務專案中常遇到兩大問題:授權請求階段重寫導致「Object moved」訊息、PostBack 表單 Action URL 錯誤導致驗證控制項失效。本文提供根因分析與程式碼級修正方案。

問題一:授權階段重寫導致「Object moved to here」

現象

首次載入頁面頂部出現「Object moved to here」文字,頁面正常但體驗不佳。

根因

預設 Intelligencia.UrlRewriter.RewriterHttpModule 掛載於 BeginRequest 事件。專案使用 Forms 認證,認證模組在 AuthenticateRequest 階段執行,若重寫發生在認證前,導致授權檢查對象路徑不一致,觸發重導向回應標頭輸出殘留訊息。

解決方案:改掛載於 AuthorizeRequest

// 修改 RewriterHttpModule.Init 方法
void IHttpModule.Init(HttpApplication context)
{
    // 原始:context.BeginRequest += new EventHandler(BeginRequest);
    context.AuthorizeRequest += new EventHandler(BeginRequest); // 在授權後、處理前重寫
}

確保 URL 重寫發生於認證授權完成之後,避免授權模組對原始路徑做決策後又被重寫導致不一致。

問題二:PostBack 表單 Action URL 錯誤

現象

重寫後頁面按鈕 PostBack 失效,或驗證控制項(RequiredFieldValidator 等)完全不工作。

方案一:使用 UrlRewriter 內建 Form 控制項(不推薦)

<form id="form1" runat="server"> → <rewriter:Form id="form1" runat="server">

副作用:所有驗證控制項失效(內建 Form 未正確實作驗證腳本註冊)。

方案二:瀏覽器定義檔 + FormRewriterControlAdapter(推薦)

  1. 建立 App_Browsers 資料夾(專案右鍵 → 加入 → 新增資料夾 → 命名 App_Browsers)。
  2. 新增 UrlRewriter.browser 檔案:
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" 
             adapterType="Intelligencia.UrlRewriter.FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

關鍵修補:FormRewriterControlAdapter 缺少建構函數

原始碼缺少接受 TextWriter 的建構函數,導致實例化失敗拋出例外。需修改原始碼重新編譯:

namespace Intelligencia.UrlRewriter
{
    public class FormRewriterControlAdapter : ControlAdapter
    {
        // ... 現有程式碼 ...

        // 新增建構函數
        public FormRewriterControlAdapter() : base() { }

        // 或針對 HtmlTextWriter 衍生類別
        public class RewriteFormHtmlTextWriter : HtmlTextWriter
        {
            public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer)
            {
                this.InnerWriter = writer;
            }
            // ... 覆寫 WriteAttribute 等方法重寫 action URL ...
        }
    }
}

修正後效果

  • 驗證控制項正常運作(HtmlForm 原生渲染保留驗證腳本註冊)。
  • PostBack form.action 自動重寫為原始請求 URL(使用者見到的網址),維持書籤/重新整理一致性。
  • 無「Object moved」殘留訊息。

完整部署檢查清單

  1. 參考 Intelligencia.UrlRewriter.dll(已套用上述兩項修正並重新編譯強名稱)。
  2. web.config 註冊模組:<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />(位於 <system.web>/<httpModules> 或 IIS7+ <system.webServer>/<modules>)。
  3. web.config 設定重寫規則(<rewriter> 區段)。
  4. 專案包含 App_Browsers/UrlRewriter.browser 檔案。
  5. 測試:重寫頁面載入無殘留訊息、PostBack 正常、驗證控制項觸發、跨頁面回傳正常。

替代方案提示

  • ASP.NET 4.0+ 專案建議遷移至內建 System.Web.Routing,功能更強、維護性更好。
  • IIS 7+ 環境可使用 URL Rewrite Module 2.0(原生 IIS 模組,效能最佳、規則支援正則、雙向 URL 生成)。
  • 輕量需求可考慮 ASP.NET 2.0 內建 urlMappings(見文章 19056)。

針對 UrlRewriter.NET 兩大經典痛點施以精準程式碼修正,即可在 ASP.NET 2.0 專案穩定使用強大 URL 重寫功能,並保留驗證控制項完整運作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved