在Web应用程序中托管PowerShell运行空间

9
我正在编写一个执行PowerShell脚本(活动目录、目录管理等)的Web服务。

目前,每个Web请求都会创建一个Runspace实例。由于Runspace初始化是耗时的操作,而且我经常需要导入模块,如ActiveDirectory,这也是耗时的操作。

在这篇博客文章“使用C#管理Exchange 2007收件人”中,Runspace实例被保留在静态字段中。

我想知道如果将Runspace实例保存在静态字段中,是否线程安全?也许这种方法还有其他缺点吗?

谢谢

1个回答

12

Runspaces不是线程安全的,也不能保证运行的脚本是线程安全的。

我建议您创建一个RunspacePool,并将您的Web服务排队到其中。这实际上很容易做到。我在v2 ctp3中进行了博客记录,但API在RTM期间没有更改。

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

更新:

如果要使用一个或多个模块预加载池中的每个Runspace,请使用RunspaceFactory.CreateRunspacePool(InitialSessionState)重载。有关如何创建和初始化此内容,请参见:

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

每次创建PowerShell实例时,将池分配给其RunspacePool属性。


啊哈,太好了!那么我应该创建静态字段RunspacePool,然后将其传递给每个在每个Web请求中执行的Powershell实例。有没有一种方法可以预加载模块到池中的Runspaces?也许我甚至不需要这样做? - Misha N.
谢谢,x0n。我希望我能给你这个答案两个赞 :) - Misha N.
顺便说一下,我纠正了一个拼写错误。你应该将池分配给PowerShell的RunspacePool属性,而不是Runspace(但你很快就会发现这个错误)。 - x0n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接