用于检测服务行为配置位置的 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/serviceMetadataetwTracking 配置。有关合并行为配置的详细信息,可以在 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

设置和运行此示例

  1. 以下示例演示如何从 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 路径格式返回包含配置文件位置的有效行为配置设置的列表。

  2. 此 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 语句格式化最终输出。请注意,它向原始结果中添加了每个服务的 SiteNameVirtualPath 以便可以关联服务及其行为设置。

删除本示例

  1. 由于运行本示例不会修改计算机上的任何资源,因此只需关闭 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 脚本中的标准函数不同,该函数包含 ParamProcessEnd,分别用于定义 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