IIS:\\AppPools 从应用程序池内部使用时似乎为空
IIS:\\AppPools appears to be empty when used from inside application pool
我正在尝试 运行 PowerShell 脚本来设置 IIS 应用程序池的一些属性。当我从 PowerShell 应用程序 运行 它时,该脚本工作正常。但是,当从 IIS 应用程序池中 运行ning 时,它不起作用。
脚本如下所示:
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
其目的是使 ASP.NET 应用程序始终使用 Hangfire 运行ning,如下所述:http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html
在 PowerShell 应用程序中 运行 时脚本 运行 正常。
但是,当它从 ASP.NET 应用程序使用 System.Management.Automation
时,最后两行失败。错误信息是:
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();
}
似乎在后台作业中修改应用程序池可以解决问题:
$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
}
不过,我仍然很好奇为什么直接在主脚本中执行时它不起作用。
我正在尝试 运行 PowerShell 脚本来设置 IIS 应用程序池的一些属性。当我从 PowerShell 应用程序 运行 它时,该脚本工作正常。但是,当从 IIS 应用程序池中 运行ning 时,它不起作用。
脚本如下所示:
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
其目的是使 ASP.NET 应用程序始终使用 Hangfire 运行ning,如下所述:http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html
在 PowerShell 应用程序中 运行 时脚本 运行 正常。
但是,当它从 ASP.NET 应用程序使用 System.Management.Automation
时,最后两行失败。错误信息是:
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();
}
似乎在后台作业中修改应用程序池可以解决问题:
$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
}
不过,我仍然很好奇为什么直接在主脚本中执行时它不起作用。