Код: Выделить всё
public void EnableAgentGlobally()
{
using ServerManager manager = new ServerManager();
var config = manager.GetApplicationHostConfiguration();
var moduleConfigSection = config.GetSection("system.webServer/modules");
var modules = moduleConfigSection.GetCollection();
if (modules.Any(m => (string)m["name"] == ModuleName))
{
logger.LogInformation("Module is already configured globally");
return;
}
var newModule = modules.CreateElement("add");
newModule["name"] = ModuleName;
modules.Add(newModule);
manager.CommitChanges();
}
Поэтому я добавил что-то вроде этого:
Код: Выделить всё
public void EnableAgentForApplications(Dictionary toMonitor)
{
using ServerManager manager = new ServerManager();
foreach (var site in manager.Sites)
{
foreach (var application in site.Applications)
{
var shouldMonitor = toMonitor.ContainsKey(site.Name) && toMonitor[site.Name].Contains(application.Path);
string targetPath = $"{site.Name}{application.Path.TrimEnd('/')}";
var appHostConfig = manager.GetApplicationHostConfiguration();
var modulesSection = appHostConfig.GetSection("system.webServer/modules", targetPath);
var modules = modulesSection.GetCollection();
var moduleLoadedUnderApplication = modules.FirstOrDefault(m => (string)m["name"] == ModuleName);
if (!shouldMonitor) {
if (moduleLoadedUnderApplication != null)
{
logger.LogInformation("Unloading module from {application}", targetPath);
var any = modules.ChildElements.Count();
modules.Remove(moduleLoadedUnderApplication);
}
continue;
}
modulesSection.OverrideMode = OverrideMode.Allow;
if (modules.Any(m => (string)m["name"] == ModuleName))
{
logger.LogInformation("Module was already loaded into {application}", targetPath);
continue;
}
var newModule = modules.CreateElement("add");
newModule["name"] = ModuleName;
newModule.SetMetadata("lockItem", true);
modulesSection.SetMetadata("inheritInChildApplications", false);
modules.Add(newModule);
}
}
manager.CommitChanges();
}
Код: Выделить всё
Моя проблема возникает, когда пользователь решает вернуться к глобальному использованию модуля. Чтобы избежать проблем с IIS, мне нужно убедиться, что я удалил все экземпляры моего модуля на уровне приложения (которые обрабатывает приведенный выше код), однако, если этот код запускается дважды, он проверит, включен ли модуль для текущего приложения (который включен глобально), и попытается удалить модуль снова, в результате чего к отдельному приложению будет добавлен тег удаления:
Код: Выделить всё
Есть ли у кого-нибудь с опытом работы с Microsoft.Web.Administration какие-либо предложения по этой проблеме? Я даже прибегал к использованию appcmd, однако, похоже, это не дает мне лучшего контроля. Мой последний вариант — загрузить и изменить необработанный XML, но это похоже на то, что я напрашиваюсь на неприятности.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -or-appcmd
Мобильная версия