2010-03-04 54 views
12

我創建了一個自定義http模塊,並希望將此模塊添加到Web配置中。 Web應用程序是一個包含多個「子應用程序」的項目。一個子應用程序只是一個文件夾,在該文件夾中它有自己的web.config。我這樣做,所以每個應用程序都有自己的應用程序相關的內容,樣式表,配置等。目錄級web.config中的Asp.net HttpModule

現在我創建了一個自定義http模塊。將此添加到根web.config時,模塊正常工作。在將http模塊配置添加到目錄級web.config(例如/Applications/MyApplication/web.config)時,模塊不再被初始化。即使msdn指出HttpModules配置元素也在目錄級別工作。任何人都知道如何解決此問題?

回答

13

爲了呼應Marvin Smit's comment,似乎一個在web.config<location>下配置<modules>根本不起作用 - 以這種方式指定的任何模塊不被調用。

什麼你可以做的是指定在根級的模塊,並使其通過appSetting,可以分層指定和重載的要求進行控制:

<configuration> 


    <appSettings> 
    <add key="UseCustomModule" value="false"/> 
    </appSettings> 


    <location path="MyFolder"> 
    <appSettings> 
     <add key="UseCustomModule" value="true"/> 
    </appSettings> 
    <system.webServer> 
     <modules> 
     <!-- CANNOT add module at this level, hence the overridden appSetting --> 
     </modules> 
    </system.webServer> 
    </location> 

    <system.webServer> 
    <modules> 
     <add name="CustomnModule" type="MyApplication.CustomModule" /> 
    </modules> 
    </system.webServer> 

</configuration> 

CustomModule然後,代碼內:

private static bool ModuleEnabled() 
    { 
     bool appSetting; 
     if (!bool.TryParse(ConfigurationManager.AppSettings["UseCustomModule"], 
          out appSetting)) 
      appSetting = false; 

     return appSetting; 
    } 

ASP.NET會看到它的UseCustomModule我們當前位置的合適值時,我們讀到了一個。

+1

我當然不喜歡這是答案的事實,但感謝確認我的懷疑。 – EricTheRed 2014-01-04 20:46:59

+0

@AakashM:一些觀察1)ModuleEnabled()方法需要調用某處,我試着在Init中調用它,如果返回值爲false,則無法從那裏繼續工作2)當對ModuleEnabled的調用處於事件例如PreSendRequestHeaders,它的作品。總而言之,Module被初始化一次,然後對於每次調用,該標誌被檢查。如果你看到任何差異,請糾正我。 – dotnetguy 2014-01-21 14:59:24

1

在您的根應用程序下的IIS中,選擇您的文件夾,它具有自己的web.cofig並定義了HttpModules,右鍵單擊並選擇屬性,在目錄選項卡上單擊創建按鈕。

它會創建子應用程序,現在HttpModules應該可以工作。

+2

這是不是真的TBH的解決方案。它改變了應用程序的根目錄。因此,您需要在子級別中創建一個新的bin目錄,並且如果它們不是GAC,則在新的bin中包含所有先前配置的項目。它有效地改變你的運行時模型。 我認爲這是一個問題(bug)沒有物理文件夾結構,但有虛擬目錄指向硬盤上不是祖先/後代相關的不同位置!似乎ASP.net不是/部分讀取web.config,如果它來自v-dir,其中文件夾不是應用程序網站文件夾的後代。 – 2010-07-08 09:21:39

+5

剛跟進研究。它的設計。 模塊和處理程序在應用程序級別配置。 (Dox狀態任何級別,但這是由服務模型的設計約束) – 2010-07-08 09:44:27

1

難道不可能創建一個自定義配置部分列出你想要包含或排除你的模塊行爲的目錄嗎?然後,您的模塊可以檢查該模塊是否應該根據請求URL進行工作。

我知道這並不完全是你問的,但肯定會給你你需要的行爲。

0

這種情況基本HTTP模塊可能是以下幾點:

public abstract class PathBasedHttpModule : IHttpModule 
{ 
    public abstract void Init(HttpApplication context); 

    protected EventHandler BuildConditionalEventHandler(Action<object, EventArgs> targetHandler) 
    { 
     EventHandler action = (sender, args) => 
     { 
      var settingsValue = CloudConfigurationManager.GetSetting(ModuleEnabledAppSettings); 
      if (!string.IsNullOrEmpty(settingsValue) && bool.Parse(settingsValue)) 
      { 
       targetHandler(sender, args); 
      } 
     }; 
     return action; 
    } 

    protected abstract string ModuleEnabledAppSettings 
    { 
     get; 
    } 

    public void Dispose() 
    { 
    } 
}