2010-02-12 53 views
4

我會嘗試儘可能具體。我繼承了一個非常陳舊的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> 
+0

如果我可能會改寫你的問題,你會問什麼是保護靜態/非靜態資源的最佳方法,以便用戶在訪問資源時總是需要登錄? – ram 2010-02-12 21:20:49

+0

BTB你能提一下你使用的是什麼版本的IIS? – ram 2010-02-12 21:22:46

+0

對不起,我正在使用IIS7。 – nokturnal 2010-02-12 22:38:35

回答

0

這聽起來像IIS未轉移到ASP.Net,這是移交請求對圖像默認情況下(IIS只是提供圖像,通常不會將它交給頁面或任何東西)。

您是否試過將映像擴展映射到自定義處理程序,無論是在IIS中還是使用web.config文件?

+0

不確定,但nokturnal提到「任何非經典的ASP頁」,所以我假設.aspx請求也無法正常工作。 – 2010-02-12 20:44:07

+0

這是正確的,它也不適用於ASPX頁面。 – nokturnal 2010-02-12 21:00:51

+0

同樣的情況。它給我帶來了經理問題。如果他正在升級經典的asp網站,處理程序設置可能不適用於.aspx。 – womp 2010-02-12 21:04:04

2

我不知道這是否是最好的方法,但作爲一個測試做下面的工作?

在你的HttpModule:

private void Application_BeginRequest(Object source, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)source).Context; 
    HttpRequest request = context.Request; 
    if(request.Url.ToString().Contains("blah.jpg")) 
    { 
     context.RewritePath("~/login.aspx?"); 
    } 
} 
+0

這將重寫爲一個傳統的ASP頁面而不是ASPX資源。此外,如果我使用BeginRequest事件,則會遇到與使用Server.Transfer方法時相同的客戶端錯誤。 – nokturnal 2010-02-12 22:36:25

0

男人,我很抱歉浪費大家的時間。

事實證明,底層數據結構有一些問題(權限設置不正確)。由於實施的安全模型的複雜性,我一定會一遍又一遍地錯過,直到最終我意識到這個問題。我一定看過它100次,沒有意識到它!

感謝所有的答覆,並再次抱歉的傢伙。

+0

不是一個答案,只是一個評論或編輯原來的帖子... – JJS 2016-05-27 21:58:12

+0

因爲我不能刪除這個問題,我選擇了這個答案,所以用戶不必讀通過所有回覆和所有評論弄清楚我是一個白癡。 – nokturnal 2016-05-28 13:40:19