【问题标题】:Portable / Interoperable WCF Contracts可移植/可互操作的 WCF 合同
【发布时间】:2010-10-03 21:21:06
【问题描述】:
我想知道是否有人在设计 WCF 合同时有一些好的提示/注意事项,并考虑到 Web 服务互操作性,无论是在旧的 Microsoft Web 服务技术(例如 WSE)和非 Microsoft 方面Java 调用 WCF Web 服务等技术。
例如:在将 DateTime 公开为合同中的类型时,是否需要考虑任何特殊规则?字典和哈希表怎么样?使用各种可用的绑定可能会遇到什么问题?
【问题讨论】:
标签:
.net
wcf
interop
datacontract
contract
【解决方案1】:
WCF 日期时间问题
关于您的 DateTime 问题,您担心通过 WCF 传递 DateTime 是正确的。这只是许多抱怨困难的环节之一......
http://daveonsoftware.blogspot.com/2008/07/wcf-datetime-field-adjusted.html
关于类型等价
根据 Juval Lowy 的《Programming WCF Services, 2nd Edition》一书中的第 3.1.3 节...
WCF 为
原始类型,因为有
模式的行业标准
这些类型。
他还指出了关于使用自定义类型作为 Operation Contract 方法的参数的问题。我认为这也适用于方法返回类型。
为了能够使用自定义类型作为
操作参数,有两个
要求:首先,类型必须是
可序列化的,其次,这两个
客户端和服务需要有一个
该类型的本地定义
产生相同的数据架构。
您可能还想查看第 F.4 节。 Data Contracts,这是他的 WCF 编码标准的一部分。 Bullet #9 适用于您的问题...
不要传递 .NET 特定的类型,例如
作为类型,作为操作参数。
绑定建立期望
基于 WSHttpBindingBase 的绑定(在 Reflector.NET 中搜索它的四个派生)将是最具互操作性的,因为它们是为互操作性而设计的。
图书推荐
我强烈推荐 Juval 的书:http://www.bookpool.com/sm/0596521308
【解决方案2】:
因此,如果您想与非 microsoft 服务互操作,您可能希望避开任何非原始类型。 WCF 使用序列化对传输数据进行编码,例如 Java 将无法反序列化哈希表。然而,WCF 是建立在 SOAP 之上的,因此通过一些工作,您应该能够让任何 SOAP 功能在 JAVA 客户端和 WCF 服务之间工作,反之亦然。
只要记住编写原语合约就可以了。