使用 Microsoft.Web.Administration 添加处理程序

问题描述

我在初始应用程序设置期间使用以下代码注册 httpHandler。

class SomeHandler: IHttpAsyncHandler {

    public void Register() {
        using (ServerManager serverManager = new ServerManager()) {

            string SITE_NAME = HostingEnvironment.ApplicationHost.GetSiteName();
            string APP_PATH = HostingEnvironment.ApplicationHost.GetVirtualPath();
            string SERVICE_CLASS = GetType().FullName.ToString();
            string HANDLER_NAME = GetType().Name;

            ConfigurationElementCollection CEC = serverManager
                .GetWebConfiguration(SITE_NAME,APP_PATH)
                .GetSection("system.webServer/handlers")
                .GetCollection();

            ConfigurationElement ele = null;
            foreach (ConfigurationElement ele1 in CEC) {
                if (ele1.Attributes["name"].Value.ToString() == HANDLER_NAME) {
                    ele = ele1;
                }
            }
            if (ele == null) {
                ele = CEC.CreateElement("add");
                ele["name"] = HANDLER_NAME;
                ...
                CEC.Add(ele);
                serverManager.CommitChanges();
            }
        }
    }
    
    ...
}

问题

它正确添加了处理程序,处理程序也能正常工作。然而,有一个问题。 最初我的 web.config 看起来像这样

<configuration>
    <appSettings />
    <system.webServer>
        <handlers>
        </handlers>
        ...
    </system.webServer>
    <system.web>
    ...
    </system.web>
</configuration>

上面代码想要的效果应该如下

<configuration>
    <appSettings />
    <system.webServer>
        <handlers>
            <add name="SomeHandler" path="..." verb="..." type="NameSpace.someHandler" />
        </handlers>
        ...
    </system.webServer>
    <system.web>
    ...
    </system.web>
</configuration>

但我得到了关注

issue with adding handler

注意处理程序被清除,所有从 IIS 服务器继承的处理程序(其中 72 个)都被添加,然后我的处理程序被添加到最后。

问题

是否有可能以某种方式阻止 CommitChanges() 方法将清除然后所有处理程序添加到本地 web.config

解决方法

看来我需要多一点搜索。

this comment 中的 CarlosAg 说

由于这个集合是一个 "mergeAppend='false'" 集合,所以它有 在底部添加元素并且必须将所有元素都带上的行为 以确保语义正确。

具有将您的添加到顶部的语义(并防止 要复制的父级)只需更改行:

handlersCollection.Add(addElement);

成为:

handlersCollection.AddAt(0,addElement);

因此将 CEC.Add(ele) 更改为 CEC.AddAt(0,ele) 解决了问题