如何:配置 WCF 服务以与 WSE 3.0 客户端进行互操作

当 WCF 服务配置为使用 2004 年 8 月版 WS-Addressing 规范时,Windows Communication Foundation (WCF) 服务与 Web Services Enhancements 3.0 for Microsoft .NET (WSE) 客户端线级兼容。

使 WCF 服务与 WSE 3.0 客户端进行互操作

  1. 定义 WCF 服务的自定义绑定。

    若要指定将 WS-Addressing 规范的 2004 年 8 月版用于消息编码,必须创建自定义绑定。

    1. 将子级 <customBinding> 添加到服务的配置文件的 <bindings>

    2. 通过将 <binding> 添加到 <customBinding> 中并设置 name 属性,为绑定指定一个名称。

    3. 通过将子级 <security> 添加到 <binding> 中,指定身份验证模式和用于保护消息安全的 WS-Security 规范的版本,该版本与 WSE 3.0 兼容。

      若要设置身份验证模式,请设置 <security>authenticationMode 属性。 身份验证模式大致等效于 WSE 3.0 中的关守安全断言。 下表将 WCF 中的身份验证模式映射到 WSE 3.0 中的关守安全断言。

      WCF 身份验证模式 WSE 3.0 关守安全断言
      AnonymousForCertificate anonymousForCertificateSecurity
      Kerberos kerberosSecurity
      MutualCertificate mutualCertificate10Security*
      MutualCertificate mutualCertificate11Security*
      UserNameOverTransport usernameOverTransportSecurity
      UserNameForCertificate usernameForCertificateSecurity

      *mutualCertificate10SecuritymutualCertificate11Security 关守安全断言之间的主要区别在于,WSE 用于保护 SOAP 消息的 WS-Security 规范的版本不同。 mutualCertificate10Security 使用 WS-Security 1.0,而 WS-Security 1.1 用于 mutualCertificate11Security。 对于 WCF,WS-Security 规范的版本在 <security>messageSecurityVersion 属性中指定。

      若要设置用于保证 SOAP 消息安全的 WS-Security 规范的版本,请设置 <security>messageSecurityVersion 属性。 若要与 WSE 3.0 进行互操作,请将 messageSecurityVersion 属性的值设置为 WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10

    4. 通过添加 <textMessageEncoding> 并将 messageVersion 设置为它的 Soap11WSAddressingAugust2004 的值,指定 WCF 使用 WS-Addressing 规范的 2004 年 8 月版本。

      备注

      在使用 SOAP 1.2 时,请将 messageVersion 属性设置为 Soap12WSAddressingAugust2004

  2. 指定该服务使用自定义绑定。

    1. <endpoint> 元素的 binding 属性设置为 customBinding

    2. <endpoint> 元素的 bindingConfiguration 属性设置为在 <binding>name 属性中为自定义绑定指定的值。

示例

下面的代码示例指定 Service.HelloWorldService 使用自定义绑定与 WSE 3.0 客户端进行互操作。 自定义绑定指定使用 WS-Addressing 的 2004 年 8 月版本和 WS-Security 1.1 规范集对所交换的消息进行编码。 使用 AnonymousForCertificate 身份验证模式保证消息的安全。

<configuration>
  <system.serviceModel>
    <services>
      <service
        behaviorConfiguration="ServiceBehavior"
        name="Service.HelloWorldService">
        <endpoint binding="customBinding" address=""
          bindingConfiguration="ServiceBinding"
          contract="Service.IHelloWorld"></endpoint>
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="ServiceBinding">
          <security authenticationMode="AnonymousForCertificate"
                  messageProtectionOrder="SignBeforeEncrypt"
                  messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
                  requireDerivedKeys="false">
          </security>
          <textMessageEncoding messageVersion ="Soap11WSAddressingAugust2004"></textMessageEncoding>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
    <behaviors>
      <behavior name="ServiceBehavior" returnUnknownExceptionsAsFaults="true">
        <serviceCredentials>
          <serviceCertificate findValue="CN=WCFQuickstartServer" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName"/>
        </serviceCredentials>
      </behavior>
    </behaviors>
  </system.serviceModel>
</configuration>

另请参阅