2009-10-02 93 views
2

我正在開發一個http模塊,它通過Authenticate事件掛接到FormsAuthentication模塊。當使用mvc /路由模塊時,每個請求都會調用Http模塊

在調試時,我注意到模塊(以及所有其他註冊的模塊)在每次客戶端請求資源時(當它請求圖像,樣式表,JavaScript文件(等等))時都會被觸發。 在集成管道模式下在IIS 7服務器上運行並通過webdev服務器進行調試(處於非集成管道模式)時會發生這種情況

由於我正在開發一個網站,其中有許多圖像通常不會被緩存客戶端瀏覽器會在很多不安全的時間點擊模塊。

我正在使用MVC及其路由機制(System.Web.Routing.UrlRoutingModule)。 創建新網站時,IIS 7(system.webServer)部分的runAllManagedModulesForAllRequests屬性在web.config中默認設置爲true,作爲名稱指示使其爲每個請求調用所有模塊。

如果我將runAllManagedModulesForAllRequests屬性設置爲false,則不會調用任何模塊。

看來,這是因爲路由模塊或mvc(不知道爲什麼),這導致asp.net(aspx)處理程序永遠不會被調用,因此事件和模塊永遠不會被調用(一次只是假設)。

我通過試圖調用「mydomain.com/Default.aspx」而不是「mydomain.com/」來測試它,並且正確地調用模塊只是一次。

我該如何解決這個問題,以便在請求頁面時只調用一次模塊,而不是在請求所有其他資源時調用這些模塊。

有沒有什麼辦法可以註冊所有的請求應該觸發asp.net(aspx)處理程序,除了特定文件類型擴展的請求? 當然,如果我選擇像/ content/images/myimage123這樣的圖片(不帶擴展名),則不會解決問題。但我不能想出任何其他方式來解決它。

有沒有更好的方法來解決這個問題?

我試圖設置一個ignoreRoute像這樣routes.IgnoreRoute(「content/{* pathInfo}」);內容文件夾包含seperat子文件夾中的所有圖像,javascript和樣式表,但它似乎沒有改變任何內容。

設置處理程序時,我可以看到有很多不同的可能性,但我似乎無法弄清楚應該如何設置一個可以使用路由模塊並具有urls/blog/post123的應用程序並且在請求圖像,JavaScript和樣式表(等)時不要調用模塊。

希望有人能幫助我嗎?

Martin

+0

遷移所有的圖片,樣式和JavaScript的到一個子域當然會解決問題。 但是,由於這是所有網站使用mvc /路由模塊(看起來)和所有內容的同一個域的普遍問題,所以我希望有人能夠解決這個問題? – MartinF 2009-10-03 13:34:21

回答

0

該問題似乎是路由模塊。

解決方案是將圖像,CSS,js移動到子域,或者您可能會註冊路由模塊應該忽略哪些文件類型/擴展。

0

下面的代碼是我在每一個MVC應用程序,以避免對服務靜態文件,JavaScript,CSS等引起路由系統的開銷使用:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = false; 
    routes.LowercaseUrls = true; 
    routes.AppendTrailingSlash = true; 
    routes.IgnoreRoute("Content/{*pathInfo}"); 
    routes.IgnoreRoute("Scripts/{*pathInfo}"); 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

    /* ... */ 
}