用于检测服务行为配置位置的 Windows PowerShell 脚本
WCF 4.0 增加了一项功能,可以合并配置层次结构中多个配置文件的服务行为。该功能更便于在高级别配置文件(例如,站点级别 web.config)中定义常用行为和在较低的配置文件中定义其他行为。以下示例演示该功能的工作方式:
站点级别 web.config
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceDebug includeExceptionDetailInFaults="True" />
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
应用程序级别 web.config
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<etwTracking profileName="Troubleshooting Tracking Profile" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
位于应用程序中并且配置为使用“MyBehavior”的 WCF 服务将有效地继承 serviceDebug/serviceMetadata 和 etwTracking 配置。有关合并行为配置的详细信息,可以在 WCF 4.0 配置中的行为合并 (https://go.microsoft.com/fwlink/?LinkId=194422) 和 .NET 配置合并默认行为 (https://go.microsoft.com/fwlink/?LinkId=194423) 上找到。
尽管可以灵活合并行为配置,但它有时会造成混乱,因为服务的有效行为配置可能不同于本地 web.config 中定义的行为配置。本示例演示如何采用 cmdlet 形式编写一个 PowerShell 脚本,该脚本分析服务行为配置并报告包含有效设置的配置文件的位置。
备注
提供这些示例仅是为了教育目的。它们不能用于生产环境,并且尚未在生产环境中进行测试。Microsoft 不对这些示例提供技术支持。
先决条件
用户应该熟悉 Windows PowerShell 脚本和 AppFabric cmdlet。
本示例具有以下先决条件:
安装了 PowerShell v2
已执行默认的 AppFabric 安装。
示例位置和文件
示例文件包括以下内容:
Readme.mhtml
Code\detectServiceBehaviorConfigLocation.ps1
设置和运行此示例
以下示例演示如何从 PowerShell 控制台运行脚本 cmdlet:
PS> cd <samples>\Samples\Management\DetectServiceBehaviorConfigLocation\Code PS> . .\detectServiceBehaviorConfigLocation.ps1 #the first dot is for loading the ps1 as a function library PS> Get-ServiceBehaviorConfigLocation -SiteName "Default Web Site" -VirtualPath /App/service.svc Name Location ---- -------- etwTracking MACHINE/WEBROOT/APPHOST/Default Web Site serviceDebug MACHINE/WEBROOT/APPHOST/Default Web Site/App serviceMetadata MACHINE/WEBROOT/APPHOST/Default Web Site/App
备注
您可能需要将执行策略从“Restricted”更改为“RemoteSigned”,本示例才能工作。
备注
Get-ServiceBehaviorConfigLocation cmdlet 带有两个参数,这两个参数指定目标服务的 SiteName 和 VirtualPath,并且以 IIS 路径格式返回包含配置文件位置的有效行为配置设置的列表。
此 cmdlet 还接受 AppFabric 的 Get-ASAppService cmdlet 通过管道传输的输出。另外,它还允许此 cmdlet 使用在指定作用域下发现的所有服务,将在下一个示例中演示这些内容:
PS> Get-ASAppService -SiteName "Default Web Site" | foreach-object {$service=$_; Get-ServiceBehaviorConfigLocation $service | select-object @{Name="SiteName"; Expression={$service.SiteName}}, @{Name="VirtualPath"; Expression={$service.VirtualPath}}, "Name", "Location"} SiteName VirtualPath Name Location -------- ----------- ---- -------- Default Web Site /App/service.svc serviceDebug MACHINE/WEBROOT/APPHOST/De... Default Web Site /App/service.svc serviceMetadata MACHINE/WEBROOT/APPHOST/De... Default Web Site /AnotherApp/HelpRequestT... etwTracking MACHINE/WEBROOT Default Web Site /AnotherApp/HelpRequestT... workflowInstanceManagement MACHINE/WEBROOT ...
将 Get-ASAppService 发现的服务列表通过管道传输到 Get-ServiceBehaviorConfigLocation 并使用 foreach 语句格式化最终输出。请注意,它向原始结果中添加了每个服务的 SiteName 和 VirtualPath 以便可以关联服务及其行为设置。
删除本示例
- 由于运行本示例不会修改计算机上的任何资源,因此只需关闭 PowerShell 会话。
说明
本示例的脚本具有四个部分:
初始化
该脚本的第一个部分确保加载所有依赖关系。包括加载用于 IIS 配置读取的 AppFabric cmdlet 模块和 Microsoft.Web.Administration 库。
if ((Get-Command -Module ApplicationServer) -eq $null)
{
Import-Module ApplicationServer
}
[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" ) | Out-Null
Cmdlet 函数
本示例的另一个目标是演示如何采用脚本而不是代码创作 cmdlet。Get-ServiceBehaviorConfigLocation 是定义此 cmdlet 的函数。与 PowerShell 脚本中的标准函数不同,该函数包含 Param、Process 和 End,分别用于定义 cmdlet 参数集、记录处理的逻辑以及清除的逻辑。
在本例中,此 cmdlet 函数仅负责标准化输入参数以及调用 GetBehaviorConfigLocationPerService 函数,后者包含用于检测行为配置设置位置的主要逻辑。
主函数
主函数 GetBehaviorConfigLocationPerService 首先在服务作用域打开配置文件。本示例在 Microsoft.Web.Administration.dll 中使用托管代码 API 来读取 IIS 配置层次结构中的配置文件。本示例查找与服务配置匹配的所有 <behavior> 元素并且枚举每个元素的所有子元素。
该函数维护存储枚举期间有效行为设置列表的哈希表 ($effectiveChildElementMap)。此哈希表的内容随着枚举向下深入配置层次结构而增加,例如,如果发现 <remove name=”X”/> 元素,则将删除设置 X。枚举完成之后,此哈希表中的最终值将与服务的有效行为配置相对应。
Helper 函数
FindBehaviorElementsByName - 查找“name”属性与指定名称匹配的 <behavior> 元素。
IsClearTagPresent - 确定 <clear> 元素是否位于指定的 <behavior> 元素下。
IsRemoveTagPresent - 确定具有匹配“name”属性的 <remove> 元素是否位于指定的 <behavior> 元素下。
Known Issues/Limitations
- Microsoft.Web.Administration API 无法确定 <remove>/<clear> 元素相对于同一父 <behavior> 元素下其他元素的顺序。本示例假定 <remove> 和 <clear> 元素首先出现。
2011-12-05