Comment puis-je manipuler proprement Mappages dans IIS7 en utilisant l'espace de noms Microsoft.Web.Administration?
Question
Lors de la manipulation Mappages en utilisant l'espace de noms Microsoft.Web.Administration
, est-il un moyen d'enlever le <remove name="handler name">
au niveau du site.
Par exemple, j'ai un site qui hérite de toutes les applications de gestionnaire de la configuration globale de mappage de gestionnaire. En applicationHost.config
la balise <location>
ressemble d'abord à ceci:
<location path="60030 - testsite-60030.com">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication userName="" />
</authentication>
</security>
</system.webServer>
</location>
Pour supprimer un gestionnaire j'utiliser un code similaire à ceci:
string siteName = "60030 - testsite-60030.com";
string handlerToRemove = "ASPClassic";
using(ServerManager sm = new ServerManager())
{
Configuration siteConfig =
serverManager.GetApplicationHostConfiguration();
ConfigurationSection handlersSection =
siteConfig.GetSection("system.webServer/handlers", siteName);
ConfigurationElementCollection handlersCollection =
handlersSection.GetCollection();
ConfigurationElement handlerElement = handlersCollection
.Where(h => h["name"].Equals(handlerMapping.Name)).Single();
handlersCollection.Remove(handlerElement);
}
Il en résulte la balise <location>
du site ressemblant à:
<location path="60030 - testsite-60030.com">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication userName="" />
</authentication>
</security>
<handlers>
<remove name="ASPClassic" />
</handlers>
</system.webServer>
</location>
Jusqu'à présent, si bon. Toutefois, si j'ajouter à nouveau le gestionnaire de ASPClassic
il en résulte:
<location path="60030 - testsite-60030.com">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication userName="" />
</authentication>
</security>
<handlers>
<remove name="ASPClassic" />
<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
</handlers>
</system.webServer>
</location>
Cela peut entraîner beaucoup de cochonneries au fil du temps pour chaque site Web qui a un gestionnaire enlevé puis rajoutées par programme. Y at-il un moyen de supprimer juste le <remove name="ASPClassic" />
en utilisant le code d'espace de noms Microsoft.Web.Administration?
La solution
Je l'ai discuté avec l'équipe produit IIS et cela semble être un bug avec le système de configuration. Ce qui est plus intéressant est que lorsque je tente ce code sur Win7 avec IIS 7.5, je ne peux même ajouter à nouveau le gestionnaire d'un programme. Toute tentative de le faire aboutit à une exception COM qui indique:
« Erreur: Impossible d'ajouter une entrée en double collection de type « ajouter » avec « nom » attribut clé unique défini sur « ASPClassic » »
Cela devient encore plus problématique, car une fois qu'un utilisateur a « retiré » un gestionnaire pour un emplacement, il ne peut pas être re-ajoutée par l'M.W.A. API jusqu'à ce bug est corrigé.