问题描述
我在初始应用程序设置期间使用以下代码注册 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>
但我得到了关注
注意处理程序被清除,所有从 IIS 服务器继承的处理程序(其中 72 个)都被添加,然后我的处理程序被添加到最后。
问题
是否有可能以某种方式阻止 CommitChanges()
方法将清除然后所有处理程序添加到本地 web.config
?
解决方法
看来我需要多一点搜索。
this comment 中的 CarlosAg 说
由于这个集合是一个 "mergeAppend='false'" 集合,所以它有 在底部添加元素并且必须将所有元素都带上的行为 以确保语义正确。
具有将您的添加到顶部的语义(并防止 要复制的父级)只需更改行:
handlersCollection.Add(addElement);
成为:
handlersCollection.AddAt(0,addElement);
因此将 CEC.Add(ele)
更改为 CEC.AddAt(0,ele)
解决了问题