簡體   English   中英

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

[英]Adding Handler with 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>

但相反,我得到了關注

添加處理程序的問題

請注意,處理程序被清除並添加了從 IIS 服務器(其中 72 個)繼承的所有處理程序,然后我的處理程序被添加到最后。

問題

是否有可能以某種方式阻止CommitChanges()方法將 clear 然后所有處理程序添加到本地web.config

好像我需要更多的搜索。

這條評論中的 CarlosAg 說

由於這個集合是一個“mergeAppend='false'”集合,它具有在底部添加元素並且必須帶上所有父元素以確保語義正確的行為。

要在頂部添加您的語義(並防止復制父級),只需更改以下行:

handlersCollection.Add(addElement);

成為:

handlersCollection.AddAt(0, addElement);

因此將CEC.Add(ele)更改為CEC.AddAt(0, ele)解決了問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM