Размещение пространства выполнения 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). Чтобы увидеть, как создать и инициализировать это, смотрите:

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

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

Другие вопросы по тегам