Размещение пространства выполнения powershell в веб-приложении - PullRequest
9 голосов
/ 11 февраля 2011

Я пишу веб-сервис, который выполняет сценарии powershell (активный каталог, управление каталогами и т. Д.).

В данный момент Runspace экземпляр создается для каждого веб-запроса. Поскольку инициализация Runspace является трудоемкой операцией, плюс мне часто приходится импортировать модули, такие как ActiveDirectory, которые также являются медленными операциями.

В этом сообщении в блоге Управление получателями Exchange 2007 с помощью C # экземпляр Runspace хранится в статическом поле.

Я странствую, что если я сохраню экземпляр Runspace в статическом поле, будет ли он безопасен для потоков? Может быть, у этого способа есть и другие недостатки?

Спасибо

1 Ответ

12 голосов
/ 11 февраля 2011

Runspaces не являются поточно-ориентированными, и при этом они не могут гарантировать, что выполняемые ими скрипты тоже.

Я бы посоветовал вам создать RunspacePool и сделать так, чтобы очередь вашего веб-сервиса работала с ним. Это на самом деле довольно легко сделать. Я писал об этом для v2 ctp3, но API не изменился для RTM.

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

Обновление:

Если вы хотите предварительно загрузить каждое пространство выполнения в пуле одним или несколькими модулями, используйте перегрузку RunspaceFactory.CreateRunspacePool (InitialSessionState). Чтобы увидеть, как создать и инициализировать это, см .:

http://www.nivot.org/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx

Каждый раз, когда вы создаете экземпляр PowerShell, присваивайте пулу его свойство RunspacePool.

...