在初始应用程序设置期间,我使用下面的代码注册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()方法添加clear,然后将所有处理程序添加到本地web.config
发布于 2021-04-20 08:22:42
看来我需要更多的搜索。
CarlosAg in 这句话说
由于这个集合是"mergeAppend='false'“集合,它具有在底部添加元素的行为,并且必须将所有父元素都带来以确保语义正确。 要想在顶部添加您的代码的语义(并防止父代码被复制),只需更改行: handlersCollection.Add(addElement); 将是: handlersCollection.AddAt(0,addElement);
因此,将CEC.Add(ele)改为CEC.AddAt(0, ele)解决了这个问题。
https://stackoverflow.com/questions/67174855
复制相似问题