将 WSE 3.0 Web 服务迁移到 WCF
 

2009-07-06 来源:microsoft.com

 

将 WSE 3.0 Web 服务迁移到 Windows Communication Foundation (WCF) 的好处包括:提高性能,支持其他传输协议、其他安全方案和 WS-* 规范。在从 WSE 3.0 迁移到 WCF 之后,Web 服务的性能最多可以提高 200% 到 400%。有关 WCF 所支持的传输协议的更多信息,请参见选择传输方式。有关 WCF 所支持的方案的列表,请参见常用安全方案。有关 WCF 所支持的规范的列表,请参见 Web 服务协议互操作性指南

以下几节提供了有关如何将 WSE 3.0 Web 服务的特定功能迁移到 WCF 的指导。

常规信息

WSE 3.0 和 WCF 应用程序领域包括网络级互操作和一组常用术语。WSE 3.0 和 WCF 应用程序可以基于二者均支持的 WS-* 规范集进行网络级互操作。在开发 WSE 3.0 或 WCF 应用程序时,需要使用一组常用的术语,例如,WSE 中的关守安全断言的名称以及身份验证模式的名称。

尽管 WCF 和 ASP.NET 或 WSE 3.0 编程模型之间存在许多相似方面,但它们仍然是不同的。有关 WCF 编程模型的详细信息,请参见基本编程生命周期

注意:
若要将 WSE Web 服务迁移到 WCF,可以使用 ServiceModel Metadata Utility Tool (Svcutil.exe) 工具来生成客户端。另一方面,该客户端还包含可以用作 WCF 服务起点的接口和类。所生成的接口将 OperationContractAttribute 属性 (attribute) 应用于将 ReplyAction 属性 (property) 设置为 * 的协定的成员。当 WSE 客户端调用具有此设置的 Web 服务时,将引发以下异常:“Web.Services3.ResponseProcessingException:WSE910:在处理响应消息的过程中发生错误,可以在内部异常中找到该错误”。若要缓解此问题,可以将 OperationContractAttribute 属性 (attribute) 的 ReplyAction 属性 (property) 设置为非 值,例如 http://Microsoft.WCF.Documentation/ResponseToOCAMethod

安全性

使用策略文件保护其安全的 WSE 3.0 Web 服务

WCF 服务可以使用配置文件来保护服务的安全,该机制与 WSE 3.0 策略文件相似。在 WSE 3.0 中,当使用策略文件来保护 Web 服务的安全时,可以使用关守安全断言或自定义策略断言。关守安全断言严格映射到 WCF 安全绑定元素的身份验证模式。WCF 身份验证模式和 WSE 3.0 关守安全断言不仅名称相同或相似,而且还使用相同的凭据类型来保护消息的安全。例如,WSE 3.0 中的 usernameForCertificate 关守安全断言映射到 WCF 中的 UsernameForCertificate 身份验证模式。下面的代码示例演示一个使用 WSE 3.0 中的 usernameForCertificate 关守安全断言的最小策略如何映射到自定义绑定中使用的 WCF 中的 UsernameForCertificate 身份验证模式。

WSE 3.0

<policies>
  <policy name="MyPolicy">
    <usernameForCertificate messageProtectionOrder="SignBeforeEncrypt"
                            requireDeriveKeys="true"/>
  </policy>
</policies>

WCF

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UserNameForCertificate" 
              messageProtectionOrder="SignBeforeEncrypt"
              requireDerivedKeys="true"/>
  </binding>
</customBinding>

若要将策略文件中指定的 WSE 3.0 Web 服务的安全设置迁移到 WCF,必须在配置文件中创建一个自定义绑定,并且必须将关守安全断言设置为它的等效身份验证模式。此外,当 WSE 3.0 客户端与服务进行通信时,必须将自定义绑定配置为使用 2004 年 8 月版 WS-Addressing 规范。当所迁移的 WCF 服务不需要与 WSE 3.0 客户端进行通信并且必须保持同等安全性时,请考虑使用 WCF 的具有适当安全设置的系统定义绑定,而不是创建自定义绑定。

下表列出了 WCF 中的 WSE 3.0 策略文件和等效自定义绑定之间的映射。

WSE 3.0 关守安全断言 WCF 自定义绑定配置
<usernameOverTransportSecurity />
<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UserNameOverTransport" />
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>
<mutualCertificate10Security />
<customBinding>
  <binding name="MyBinding">
    <security messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary
2005WSSecurityPolicy11BasicSecurityProfile10" authenticationMode="MutualCertificate" />
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>
<usernameForCertificateSecurity />
<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UsernameForCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>
<anonymousForCertificateSecurity />
<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="AnonymousForCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>
<kerberosSecurity />
<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="Kerberos"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>
<mutualCertificate11Security />
<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="MutualCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

有关在 WCF 中创建自定义绑定的更多信息,请参见自定义绑定

使用应用程序代码保护其安全的 WSE 3.0 Web 服务

无论是使用 WSE 3.0 还是使用 WCF,都可以在应用程序代码而不是配置中指定安全要求。在 WSE 3.0 中,可以通过以下方法完成此工作:创建一个派生自 Policy 类的类,然后通过调用 Add 方法添加相应的要求。有关在代码中指定安全要求的详尽信息,请参见如何:在不使用策略文件的情况下保护 Web 服务的安全(可能为英文网页)。在 WCF 中,若要在代码中指定安全要求,可创建 BindingElementCollection 类的一个实例,然后将 SecurityBindingElement 的一个实例添加到 BindingElementCollection。使用 SecurityBindingElement 类的静态身份验证模式帮助器方法来设置安全断言要求。有关使用 WCF 在代码中指定安全要求的详尽信息,请参见如何:使用 SecurityBindingElement 创建自定义绑定如何:为指定的身份验证模式创建 SecurityBindingElement

WSE 3.0 自定义策略断言

在 WSE 3.0 中,有两种类型的自定义策略断言:保护 SOAP 消息安全的策略断言和不保护 SOAP 消息安全的策略断言。保护 SOAP 消息安全的策略断言派生自 WSE 3.0 SecurityPolicyAssertion 类,而 WCF 中在概念上等效的类是 SecurityBindingElement 类。

需要特别注意的一点是,WSE 3.0 关守安全断言是 WCF 身份验证模式的子集。如果已经在 WSE 3.0 中创建了一个自定义策略断言,则可能存在一个等效的 WCF 身份验证模式。例如,WSE 3.0 没有提供与 UsernameOverTransport 关守安全断言等效的 CertificateOverTransport 安全断言,但使用 X.509 证书进行客户端身份验证。如果您已经为此方案定义了自己的自定义策略断言,则 WCF 会使迁移工作变得非常简单。WCF 为此方案定义了身份验证模式,因此您可以利用静态身份验证模式帮助器方法来配置一个 WCF SecurityBindingElement

当不存在与可保护 SOAP 消息安全的自定义策略断言等效的 WCF 身份验证模式时,请从 TransportSecurityBindingElementSymmetricSecurityBindingElement AsymmetricSecurityBindingElement WCF 类派生一个类,并指定等效的绑定元素。有关详尽信息,请参见如何:使用 SecurityBindingElement 创建自定义绑定

若要转换不保护 SOAP 消息安全的自定义策略断言,请参见筛选和示例Custom Message Interceptor

WSE 3.0 自定义安全令牌

用于创建自定义令牌的 WCF 编程模型与 WSE 3.0 不同。有关在 WSE 中创建自定义令牌的详细信息,请参见创建自定义安全令牌(可能为英文网页)。有关在 WCF 中创建自定义令牌的详细信息,请参见如何:创建自定义令牌

WSE 3.0 自定义令牌管理器

WCF 中用于创建自定义令牌管理器的编程模型与 WSE 3.0 不同。有关如何创建自定义令牌管理器和自定义安全令牌所需的其他组件的详细信息,请参见如何:创建自定义令牌
注意:
如果已经创建了一个自定义 UsernameToken 安全令牌管理器,则 WCF 会提供一个比创建自定义安全令牌管理器更容易的机制来指定身份验证逻辑。有关详尽信息,请参见如何:使用自定义用户名和密码验证程序

使用 MTOM 编码 SOAP 消息的 WSE 3.0 Web 服务

像 WSE 3 应用程序一样,WCF 应用程序可以在配置中指定 MTOM 消息编码。若要迁移此设置,请将 mtomMessageEncoding element 添加到服务的绑定中。下面的代码示例演示如何在 WSE 3.0 中为在 WCF 中等效的服务指定 MTOM 编码。

WSE 3.0

<messaging>
    <mtom clientMode="On"/>
</messaging>

WCF

<customBinding>
  <binding name="MyBinding">
    <mtomMessageEncoding/>
  </binding>
</customBinding>

消息传递

使用 WSE 消息 API 的 WSE 3.0 应用程序

当使用 WSE 消息 API 来获取对在客户端和服务之间交换的 XML 的直接访问时,可以将应用程序转换为使用“Plain Old XML”(POX)。有关 POX 的详尽信息,请参见与 POX 应用程序的互操作性。有关 WSE 消息 API 的详尽信息,请参见使用 WSE 消息 API 发送和接收 SOAP 消息(可能为英文网页)。

传输

TCP

默认情况下,使用 TCP 传输协议发送 SOAP 消息的 WSE 3.0 客户端和 Web 服务不能与 WCF 客户端和 Web 服务进行交互操作。这一不兼容性是由于 TCP 协议中使用的组帧存在差异以及性能方面的原因。但是,有一个 WCF 示例详细解释了如何实现能够与 WSE 3.0 进行交互操作的自定义 TCP 会话。有关此示例的详细信息,请参见Transport: WSE 3.0 TCP Interoperability

若要指定 WCF 应用程序使用 TCP 传输协议,请使用 netTcpBinding Element

自定义传输协议

在 WCF 中,与 WSE 3.0 自定义传输协议等效的机制是通道扩展。有关创建通道扩展的详细信息,请参见扩展通道层

火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织