我正在尝试构建一个 Powershell 脚本来自动更改我们已部署的 Web 应用程序的连接字符串。
我正在尝试使用该WebAdministration
命令Set-WebApplicationProperty
,但收到有关Unrecognized element: 'providerOption'
PS IIS:\Sites\Default Web Site\VirtualPath> Set-WebConfigurationProperty "//connectionStrings/*[@name='DefaultConnection']" -Name ConnectionString -Value "<NEW CONNECTION STRING>" -PSPath (Get-Location).Path
Set-WebConfigurationProperty : Filename: \\?\C:\Windows\Microsoft.NET\Framework64\v4.0.30319\CONFIG\web.config
Line number: 53
Error: Unrecognized element 'providerOption'
At line:1 char:1
+ Set-WebConfigurationProperty "//connectionStrings/*[@name='DefaultConnection']" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Set-WebConfigurationProperty], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.IIs.PowerShell.Provider.SetConfigurationPropertyCommand
我在 StackOverflow 上找到了有关同一错误的一些信息,但它似乎与 .NET 4.0 的原始版本有关:https://stackoverflow.com/questions/21308965/unrecognized-element-provideoption
一些额外的环境信息:
操作系统:Windows Server 2008 R2
IIS:7.5
Powershell:v4.0
.NET Framework 版本:4.5.2
还值得注意的是,此命令在 Windows 8.1、IIS 8.5、Powershell 4.0、.NET 4.5.2 上运行良好
编辑:凭直觉,我比较了Web.config
一台能工作的机器和一台不能工作的机器的错误中指定的值。它们是相同的。
答案1
事实证明,使用 Powershell 只是一种障眼法。IIS 利用位于 中的文件C:\Windows\System32\inetsrv\config\schema
来验证 Web 服务器所使用的各种 xml 配置文件。在 IIS 7 和 IIS 7.5 中,FX_schema.xml
缺少 的声明providerOption
。
我的解决方法是通过向此目录添加另一个文件来修补架构文件,该文件的名称"FX_schema.patch.xml"
如下:
<!--
IIS 7.0 and IIS 7.5 contain incorrect system.codedom sections in their FX_schema.xml files.
This version was taken from IIS 8.5 and contains the correct validations for the default web.config
in the CLR 4.0 folder. This file is only required on Windows Vista, 7, Server 2008 and Server 2008 R2.
-->
<configSchema>
<sectionSchema name="system.codedom">
<element name="compilers">
<collection addElement="compiler" removeElement="remove" clearElement="clear">
<attribute name="language" type="string" isCombinedKey="true" />
<attribute name="extension" type="string" isCombinedKey="true" />
<attribute name="type" type="string" />
<attribute name="warningLevel" type="int" />
<attribute name="compilerOptions" type="string" />
<collection addElement="providerOption" >
<attribute name="name" type="string" isCombinedKey="true" />
<attribute name="value" type="string" isCombinedKey="true" />
</collection>
</collection>
</element>
</sectionSchema>
</configSchema>
该文件与现有的 FX_schema.xml 合并,并允许我的WebAdministration
命令成功完成。