【问题标题】:Hosting powershell runspace in web application在 Web 应用程序中托管 powershell 运行空间
【发布时间】:2011-06-25 12:45:41
【问题描述】:

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

现在,Runspace 实例是根据网络请求创建的。由于 Runspace 初始化是一项耗时的操作,而且我经常需要导入模块,例如 ActiveDirectory,这些操作也很慢。

在这篇博文Managing Exchange 2007 Recipients with C# 中,Runspace 实例保存在一个静态字段中。

如果我将 Runspace 实例保留在静态字段中会怎样,它会是线程安全的吗?也许这样做还有其他缺点?

谢谢

【问题讨论】:

    标签: c# powershell powershell-2.0 runspace powershell-hosting


    【解决方案1】:

    运行空间不是线程安全的,它们也不能保证它们正在运行的脚本也是线程安全的。

    我建议您创建一个 RunspacePool 并让您的 Web 服务队列为其工作。这实际上很容易做到。我为 v2 ctp3 写了一篇博客,但 RTM 的 API 没有改变。

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

    更新:

    如果您想用一个或多个模块预加载池中的每个运行空间,请使用 RunspaceFactory.CreateRunspacePool(InitialSessionState) 重载。要了解如何创建和初始化它,请参阅:

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

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

    【讨论】:

    • 啊哈,太棒了!因此,我应该创建静态字段 RunspacePool,然后将其传递给在每个 Web 请求中执行的每个 Powershell 实例。有没有办法将模块预加载到池中的运行空间?也许我什至不需要这样做?
    • tnx,x0n。我希望我能给你两个赞成这个答案:)
    • np - 顺便说一句,我修正了一个错字。您将池分配给 powershell 的 runspacepool 属性,而不是 runspace(但您很快就会发现这一点。)
    猜你喜欢
    • 2014-01-23
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多