Asp.net HttpModule在目录级web.config中

时间:2010-03-04 10:49:00

标签: .net asp.net

我创建了一个自定义的http模块,并希望将此模块添加到Web配置中。 Web应用程序是一个包含多个“子应用程序”的项目。子应用程序只是一个文件夹,在该文件夹中它有自己的web.config。我这样做是因为每个应用程序都有自己的应用程序相关内容,样式表,配置等。

现在我创建了一个自定义的http模块。将此添加到根web.config时,模块正常工作。将http模块配置添加到目录级web.config(例如/Applications/MyApplication/web.config)时,模块不再被初始化。即使msdn声明HttpModules配置元素也在目录级别工作。谁知道如何解决这个问题?

4 个答案:

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