导出 (0) 打印
全部展开
此文章由机器翻译。 将光标移到文章的句子上,以查看原文。 更多信息。
译文
原文

IPolicyImportExtension 接口

为可导入有关绑定的自定义策略断言的对象定义一个方法。

命名空间:  System.ServiceModel.Description
程序集:  System.ServiceModel(在 System.ServiceModel.dll 中)

public interface IPolicyImportExtension

IPolicyImportExtension 类型公开以下成员。

  名称说明
公共方法ImportPolicy定义一个可导入自定义策略断言和添加实现绑定元素的方法。
页首

实现 IPolicyImportExtension 接口可以搜索有关终结点功能或要求的自定义策略断言的特殊终结点公开的 WSDL 信息。 通常,策略导入程序会先搜索特定断言,然后插入绑定元素并配置绑定元素,或者修改协定以支持该断言的要求。

与其副本 IPolicyExportExtension 不同,IPolicyImportExtension 不要求通过 BindingElement 对象实现;您既可以通过使用“示例”一节中阐示的客户端配置节来加载它,也可以通过编程方式将其添加到 System.ServiceModel.Description.WsdlImporter 构造函数来加载它。

Windows Communication Foundation (WCF) 可将两个对象传递到 ImportPolicy 方法,这两个对象分别是 MetadataImporterPolicyConversionContext 通常,PolicyConversionContext 对象包含每个绑定范围的策略断言。

IPolicyImportExtension 实现会完成以下操作步骤:

  1. 调用 GetBindingAssertionsGetMessageBindingAssertionsGetOperationBindingAssertions 方法,依据范围查找其所负责的自定义策略断言。

  2. 从断言集合中移除策略断言。 PolicyAssertionCollection.Remove 方法在一个步骤中就可以完成断言的查找、返回和移除操作。

  3. 通过将所要求的自定义 BindingElement 添加到 BindingElements 属性或修改 PolicyConversionContext.Contract 属性来修改绑定堆栈或协定。

步骤 2 非常重要。 在调用了所有策略导入程序后,WCF 将检查是否存在剩余的策略协定。 如果存在,则 WCF 会认为策略导入失败,将不会导入相关绑定。

重要说明重要事项

恶意的元数据供应商可将格式错误的 XML 作为元数据的一部分进行发送,从而尝试利用策略导入程序。 强烈建议使用安全可靠的自定义策略导入程序,以处理发送给它的所有格式的 XML。

自定义 MetadataImporter 实现必须实现自己的 PolicyConversionContext 对象,以提取附加到自定义元数据格式的策略断言。

如果要导入和导出非策略断言的自定义 WSDL 元素,请参见 System.ServiceModel.Description.IWsdlExportExtensionSystem.ServiceModel.Description.IWsdlImportExtension

说明说明

通过使用配置文件中的相同配置元素和 /svcutilConfig:<configFile> 选项,您可以使用带有 ServiceModel 元数据实用工具 (Svcutil.exe) 的自定义策略导入程序和导出程序。

下面的代码示例演示了如何使用 PolicyAssertionCollection.Remove 方法在一个步骤内完成断言的查找、返回和移除操作。


  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
   *     any remaining assertions for the binding cause the binding to fail import and not be 
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // Locate the custom assertion and remove it.
    XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1);
    if (customAssertion != null)
    {
      Console.WriteLine(
        "Removed our custom assertion from the imported "
        + "assertions collection and inserting our custom binding element."
      );
      // Here we would add the binding modification that implemented the policy.
      // This sample does not do this.
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name);
      Console.WriteLine(customAssertion.OuterXml);
      Console.ForegroundColor = ConsoleColor.Gray;
    }
 }
#endregion


下面的代码示例演示了客户端应用程序配置文件是如何在调用 System.ServiceModel.Description.MetadataResolver 时加载自定义策略导入程序的。


<client>
    <endpoint 
      address="http://localhost:8080/StatefulService" 
      binding="wsHttpBinding"
      bindingConfiguration="CustomBinding_IStatefulService" 
      contract="IStatefulService"
      name="CustomBinding_IStatefulService" />
  <metadata>
    <policyImporters>
      <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/>
    </policyImporters>
  </metadata>
</client>



<client>
    <endpoint 
      address="http://localhost:8080/StatefulService" 
      binding="wsHttpBinding"
      bindingConfiguration="CustomBinding_IStatefulService" 
      contract="IStatefulService"
      name="CustomBinding_IStatefulService" />
  <metadata>
    <policyImporters>
      <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/>
    </policyImporters>
  </metadata>
</client>


下面的代码示例演示了如何使用 MetadataResolver 下载元数据,并将其解析到说明对象中。


// Download all metadata. 
ServiceEndpointCollection endpoints
  = MetadataResolver.Resolve(
    typeof(IStatefulService),
    new EndpointAddress("http://localhost:8080/StatefulService/mex")
  );


.NET Framework

受以下版本支持:4.5.2、4.5.1、4.5、4、3.5、3.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参阅.NET Framework 系统要求

社区附加资源

添加
Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2014 Microsoft