Размещение пространства выполнения powershell в веб-приложении
Я пишу веб-сервис, который выполняет сценарии PowerShell (активный каталог, управление каталогами и т. Д.).
Прямо сейчас экземпляр Runspace создается для каждого веб-запроса. Поскольку инициализация Runspace является трудоемкой операцией, плюс часто мне приходится импортировать модули, такие как ActiveDirectory, которые также являются медленными операциями.
В этой статье блога " Управление получателями Exchange 2007 с помощью C#" экземпляр Runspace хранится в статическом поле.
Я хотел бы узнать, что если я оставлю экземпляр Runspace в статическом поле, будет ли он безопасен для потоков? Может быть, есть другие недостатки в этом?
Спасибо
1 ответ
Runspaces не являются поточно-ориентированными, и при этом они не могут гарантировать, что выполняемые ими скрипты тоже.
Я бы посоветовал вам создать RunspacePool и сделать так, чтобы очередь вашего веб-сервиса работала с ним. Это на самом деле довольно легко сделать. Я писал об этом для v2 ctp3, но API не изменился для RTM.
http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
Обновить:
Если вы хотите предварительно загрузить каждое пространство выполнения в пуле одним или несколькими модулями, используйте перегрузку RunspaceFactory.CreateRunspacePool(InitialSessionState). Чтобы увидеть, как создать и инициализировать это, смотрите:
Каждый раз, когда вы создаете экземпляр PowerShell, присваивайте пулу его свойство RunspacePool.