Asp.net HttpModule в уровне каталога web.config
Я создал собственный http-модуль и хочу добавить этот модуль в веб-конфигурацию. Веб-приложение представляет собой проект, который содержит несколько "подпрограмм". Под-приложение - это просто папка, и внутри этой папки у нее есть свой собственный web.config. Я делаю это, поэтому каждое приложение имеет собственное содержимое, связанное с приложением, таблицы стилей, конфиги и т.д.
Теперь я создал собственный http-модуль. При добавлении этого файла в корневой web.config модуль работает правильно. При добавлении конфигурации http-модуля на web.config на уровне каталогов (например,/Applications/MyApplication/web.config) модуль больше не инициализируется. Несмотря на то, что в msdn указано, что элемент конфигурации HttpModules также работает на уровне каталогов. Кто-нибудь знает, как это решить?
Ответы
Ответ 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()
{
}
}