Включите модуль в теге местоположения IIS через Microsoft.Web.Administration или AppCmd.C#

Место общения программистов C#
Ответить
Anonymous
 Включите модуль в теге местоположения IIS через Microsoft.Web.Administration или AppCmd.

Сообщение Anonymous »

Возможно, я раздвигаю границы библиотеки Microsoft.Web.Administration, но эта проблема не дает мне покоя. Я работаю над приложением, которому необходимо загрузить модуль IIS в IIS. До сих пор я загружал свой модуль на глобальном уровне с помощью Microsoft.Web.Administration ServerManager через:

Код: Выделить всё

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();
}
Это создаст тег местоположения в моем файле ApplicationHost.config (поэтому мне не нужно создавать кучу файлов web.config), например: Пока все хорошо.
Моя проблема возникает, когда пользователь решает вернуться к глобальному использованию модуля. Чтобы избежать проблем с IIS, мне нужно убедиться, что я удалил все экземпляры моего модуля на уровне приложения (которые обрабатывает приведенный выше код), однако, если этот код запускается дважды, он проверит, включен ли модуль для текущего приложения (который включен глобально), и попытается удалить модуль снова, в результате чего к отдельному приложению будет добавлен тег удаления: Насколько я понимаю, Microsoft.Web.Administration не предоставляет возможности различать, на каком уровне загружен модуль в данный момент, а также не дает возможности увидеть, что модуль помечен как удаленный, что означает, что я могу случайно, молча отключить свой модуль.
Есть ли у кого-нибудь с опытом работы с Microsoft.Web.Administration какие-либо предложения по этой проблеме? Я даже прибегал к использованию appcmd, однако, похоже, это не дает мне лучшего контроля. Мой последний вариант — загрузить и изменить необработанный XML, но это похоже на то, что я напрашиваюсь на неприятности.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -or-appcmd
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»