asp.net - 从应用程序池内部使用时,IIS:\\AppPools 似乎为空

标签 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 应用程序中运行时运行良好。

但是,当它从 ASP.NET 应用程序使用 System.Management.Automation 时,最后两行失败。错误信息是:
Cannot find path 'IIS:\\AppPools\\fwsetupsite' because it does not exist.

作为测试,我添加了一行
dir IIS:\AppPools > c:\apppools.txt

产生一个空文件 c:\apppools.txt如果从 ASP.NET 应用程序运行,但在从 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
}

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

关于asp.net - 从应用程序池内部使用时,IIS:\\AppPools 似乎为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45283893/

相关文章:

powershell - 从一个 Azure 自动化 Runbook 调用另一个 Azure 自动化 Runbook 时出错

asp.net - Powershell 脚本创建一个 "sub"网站

ssl - IIS 将 HTTP 重定向到 HTTPS 重定向循环

asp.net - 使用 Windows 身份验证、AJAX、ASMX 和外部 ISA 的 HTTP 401 过多

javascript - 如何在选择的数据加载之前显示进度条?

javascript - 将 JavaScript 移动到外部文件,当它包含 document.getElementById ('<%= control.ClientID%>' 时)

powershell - 有没有办法获得大于 int32 的数字范围?

powershell - 将 SSL 自动化任务添加到管道

visual-studio-2008 - 无法在 Web 服务器上开始调试。 Visual Studio 2008

c# - 在 C# ASP.net 中将 ALPHA-2 转换为 ALPHA-3