IIS:\\ AppPools在内部应用程序池中使用时似乎为空

时间:2017-07-24 15:00:19

标签: asp.net powershell iis hangfire

我正在尝试运行PowerShell脚本来在IIS应用程序池上设置一些属性。当我从PowerShell应用程序运行它时,该脚本工作正常。但是,从IIS应用程序池内部运行时,它不起作用。

该脚本如下所示:

import-module webadministration

$WebSiteName = "MyWebsite"
$WebSiteFullName = "IIS:\Sites\" + $WebSiteName
$ApplicationPool = Get-Item $WebSiteFullName | Select-Object applicationPool
$ApplicationPoolFullName = "IIS:\AppPools\" + $ApplicationPool.applicationPool

Add-WebConfiguration -filter '/system.applicationHost/serviceAutoStartProviders' -value (@{name="ApplicationPreload";type="MyApplication.ApplicationPreload, MyApplication"})

set-itemproperty $WebSiteFullName -name applicationDefaults.serviceAutoStartEnabled -value True
set-itemproperty $WebSiteFullName -name applicationDefaults.serviceAutoStartProvider -value 'ApplicationPreload'

set-itemproperty $ApplicationPoolFullName -name autoStart -value True
set-itemproperty $ApplicationPoolFullName -name startMode -value 1 # 1 = AlwaysRunning

其目的是使用Hangfire始终运行ASP.NET应用程序,如下所述:http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html

在PowerShell应用程序中运行时,脚本运行正常。

但是,当它使用System.Management.Automation从ASP.NET应用程序进行时,最后两行失败。错误消息是:

Cannot find path 'IIS:\\AppPools\\fwsetupsite' because it does not exist.

作为测试,我添加了一行

dir IIS:\AppPools > c:\apppools.txt

如果从ASP.NET应用程序运行,则会生成空文件c:\apppools.txt,但在从PowerShell应用程序运行时,会正确地将所有应用程序池的名称转储到文件中。所以似乎IIS:\\AppPools是空的。

从ASP.NET应用程序中运行脚本的C#代码如下所示:

using (PowerShell shell = PowerShell.Create())
{
    string script = File.ReadAllText(FilePath);
    shell.AddScript(script);
    shell.Invoke();
}

1 个答案:

答案 0 :(得分:0)

似乎在后台作业中对应用程序池进行修改可以解决问题:

$job = Start-Job -ScriptBlock {
    param($ApplicationPoolFullName)

    import-module webadministration

    # Enable auto start and always running on application pool
    set-itemproperty $ApplicationPoolFullName -name autoStart -value True
    set-itemproperty $ApplicationPoolFullName -name startMode -value 1 # 1 = AlwaysRunning, 0 = OnDemand
} -ArgumentList $ApplicationPoolFullName

Wait-Job $job | Out-Null

if ($job.State -eq 'Failed') {
    exit 1
}

我仍然很好奇为什么直接在主脚本中执行它时它不起作用。