我會嘗試儘可能具體。我繼承了一個非常陳舊的C++ ISAPI過濾器,它保護了傳統的ASP網站,並負責創建HTTPModule以直接替換它。ASP.NET HttpModules&Server.Transfer/Server.TransferRequest/RewritePath問題
首先我掛鉤了OnPreRequestHandlerExecute事件。然後,我成功地重新創建了原始ISAPI過濾器所創建的存儲過程的調用。這些調用返回一個statusCode,我拋出一個CASE語句,並根據狀態碼設置一個「重定向」字符串變量(sUrl)。例如,statusCode 15會將sUrl設置爲「/Session/Login.asp」。這一切都成功。
下一步是頁面的實際「重定向」。在C++中的模塊是做以下:
Headers.push_back(HeadersList::value_type("url", "/Session/Errors/SecurIDRequired.asp"));
我試圖通過以下重新創建此功能:
HttpContext.Current.RewritePath(sUrl);
這對所有傳統的ASP頁面工程100%。當用戶試圖訪問「http://somedomain.com/Blah.jpg」時,問題就會出現,模塊成功運行,設置正確的statusCode爲15,並調用RewritePath方法,但不會將URL重寫到登錄頁面。 。傳統的ASP頁面
於是我開始尋找其他的選擇,而不是RewritePath看着TransferRequest這看起來前途無量,所以我改變了代碼:
HttpContext.Current.Server.TransferRequest(sUrl, true);
現在,這會將所有請求的文件類型登錄頁面,但奇怪的事情發生。首先,我在FireBug中得到以下客戶端錯誤:
syntax error https://somedomain.com/JS/jQuery/jquery.js Line 2
...其他一些圍繞jQuery的javascript錯誤。我看着Net面板,它成功加載了jQuery庫,所以我對此感到不知所措(這不會發生在RewritePath方法中)。
最後,我嘗試使用好老的Server.Transfer和得到這個服務器端錯誤:
No http handler was found for request type 'GET'
唷!我希望我的解釋是足夠的:)
我想我真正的問題是這樣的,什麼是完成我試圖完成的最好方法。我覺得好像RewritePath方法是最好的,任何提示將不勝感激。
乾杯!
編輯:是
包含在web.config內的處理程序如下:
<httpHandlers>
<remove verb="*" path="*.asmx" />
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>
如果我可能會改寫你的問題,你會問什麼是保護靜態/非靜態資源的最佳方法,以便用戶在訪問資源時總是需要登錄? – ram 2010-02-12 21:20:49
BTB你能提一下你使用的是什麼版本的IIS? – ram 2010-02-12 21:22:46
對不起,我正在使用IIS7。 – nokturnal 2010-02-12 22:38:35