我们正在使用 Windows Server 2012 / IIS8 上的 Powershell 自动化我们的 IIS 服务器构建和配置。
这些脚本创建网站、应用程序池、设置权限、绑定证书等。这些脚本由包含所有网站详细信息的 XML 文件驱动。这些脚本配置了运行网站所需的一切,除了内容之外,这些内容随后被复制到相关目录中。
一切正常,而目录中没有内容(只是用于测试目的的默认 html 页面)。
如果我们将应用程序复制到目录中并尝试使用 Powershell 进一步配置站点,则使用 .NET 2 和 3.5 的应用程序会引发以下错误:
错误:定义了重复的“system.web.extensions/scripting/scriptResourceHandler”部分
+ CategoryInfo : NotSpecified: (:) [Set-WebConfiguration], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.IIs.PowerShell.Provider.SetConfigurationCommand
+ PSComputerName : xxxxxxxxxxx
我已经彻底研究了这个主题,看来问题是 System.Web.Extensions 已移至 .NET 4.0 应用程序的 machine.config 中,这意味着在 web.config 中再次定义该部分是重复的。这是有道理的,除了错误的应用程序是使用设置为 .NET 2.0 的应用程序池运行的 .NET 2.0 或 3.5 应用程序。
我认为问题在于 Powershell 本身(在 Windows Server 2012 上)使用 CLR 4.0 运行,因此在进行 IIS 配置更改时,它需要分层解析配置文件(从 machine.config 到 web.config)。它认为 System.Web.Extensions 是重复的,即使在运行时它不是(因为运行时将是 2.0 版)。更改应用程序池运行的 .NET 版本对这个问题没有任何影响,因为这仅与应用程序运行时有关。
通过限制 Powershell 仅使用 CLR 2.0 似乎有一种解决方法,但这不适用于 .NET 4.0 应用程序,然后会报告缺少的部分定义。因此,解决一个版本的问题会在另一个版本中产生问题。
我的问题是,以前有没有人经历过这种情况,当应用程序使用混合 .NET 版本时,是否有任何解决方法允许 Powershell 配置 IIS?
我在这个问题上花了很多时间,因此非常感谢任何帮助。
更新:这个错误仍然没有进一步,我猜由于缺乏评论,这不是一件容易的事。
我正在查看 IIS 8 Powershell 文档,可以看到他们在 Set-WebConfiguration 命令中添加了一个 Clr 属性,但这没有效果,因为我尝试修改的元素(在本例中为 HTTP 重定向)最终出现在 applicationhost .config 文件和 Powershell 会引发以下警告:
WARNING: Ignoring -Clr value when PSPath is not 'MACHINE/WEBROOT' or 'MACHINE'.
当修改不是 machine.config 或根 web.config 时。
看来根本没有办法解决这个问题(我认为这是一个错误)也许在任何更新之前重命名应用程序目录中的 web.config 文件是 Powershell 不会尝试解析配置的答案。任何人对此有任何想法表示赞赏。