Подтвердить что ты не робот

Asp.net HttpModule в уровне каталога web.config

Я создал собственный http-модуль и хочу добавить этот модуль в веб-конфигурацию. Веб-приложение представляет собой проект, который содержит несколько "подпрограмм". Под-приложение - это просто папка, и внутри этой папки у нее есть свой собственный web.config. Я делаю это, поэтому каждое приложение имеет собственное содержимое, связанное с приложением, таблицы стилей, конфиги и т.д.

Теперь я создал собственный http-модуль. При добавлении этого файла в корневой web.config модуль работает правильно. При добавлении конфигурации http-модуля на web.config на уровне каталогов (например,/Applications/MyApplication/web.config) модуль больше не инициализируется. Несмотря на то, что в msdn указано, что элемент конфигурации HttpModules также работает на уровне каталогов. Кто-нибудь знает, как это решить?

4b9b3361

Ответ 1

Чтобы откликнуться комментарий Marvin Smit, кажется, что настройка <modules> под <location> в web.config просто не работает - любые модули, указанные таким образом, НЕ вызывают.

Что вы можете сделать, так это указать модуль на корневом уровне и управлять им с помощью 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 для нашего текущего местоположения - это тот, который мы читаем.

Ответ 2

В IIS под вашим корневым приложением выберите свою папку с собственным web.cofig с установленными HttpModules, щелкните правой кнопкой мыши и выберите свойство, на вкладке "Каталог" нажмите кнопку "Создать".

Он создаст дополнительное приложение, и теперь HttpModules должны работать.

Ответ 3

Невозможно создать настраиваемый раздел конфигурации, в котором перечислены каталоги, которые вы хотите включить или исключить поведение вашего модуля? Затем ваш модуль может проверить это, чтобы убедиться, что он должен работать на основе URL-адреса запроса.

Я знаю, что не совсем то, что вы просите, но, безусловно, даст вам то поведение, которое вам нужно.

Ответ 4

Base HttpModule для этого случая может быть следующим:

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()
    {
    }
}