我创建了一个自定义的http模块,并希望将此模块添加到Web配置中。 Web应用程序是一个包含多个“子应用程序”的项目。子应用程序只是一个文件夹,在该文件夹中它有自己的web.config。我这样做是因为每个应用程序都有自己的应用程序相关内容,样式表,配置等。
现在我创建了一个自定义的http模块。将此添加到根web.config时,模块正常工作。将http模块配置添加到目录级web.config(例如/Applications/MyApplication/web.config)时,模块不再被初始化。即使msdn声明HttpModules配置元素也在目录级别工作。谁知道如何解决这个问题?
答案 0 :(得分:14)
要回显Marvin Smit's comment,似乎在<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;
}
的代码中:
UseCustomModule
ASP.NET将确保我们当前位置的{{1}}的适当值是我们读取的值。
答案 1 :(得分:1)
在根应用程序下的IIS中,选择您自己的web.cofig文件夹,其中定义了HttpModules,右键单击并选择属性,在“目录”选项卡上单击“创建”按钮。
它将创建子应用程序,现在HttpModules应该可以工作。
答案 2 :(得分:1)
是否无法创建自定义配置部分,列出要包含的目录或排除模块行为?然后,您的模块可以检查它是否应该根据请求URL执行此操作。
我知道这不是你所要求的,但肯定会给你你需要的行为。
答案 3 :(得分:0)
此案例的基本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()
{
}
}