我正在创建一个将由.NET和Java客户端应用程序使用的WCF服务。
我们在团队中没有任何Java经验,因此正在寻找遵循的准则或规则,以确保我们不会意外地在WCF服务界面中包含任何类型,或者做任何其他事情以防止它被Java客户端应用程序。
我们的担忧是否有充分根据?如果是这样,我们应该警惕什么?
关注的一个例子是,服务接口中是否以Java客户端可以正确理解的方式表示.NET DateTime
值。
关注的第二个例子是使用任何可以为空的值类型(bool?
,int?
等)。
目前,我们的一些开发团队正在手写.xsd文件,以定义WCF接口方法将作为参数并返回为返回值的各种对象。然后他们使用xsd.exe从这些中自动生成C#类。
这背后的基本原理是它保证生成的类不包含任何特定于.NET的东西。
缺点是这增加了开发负担,也使我们无法使用<summary>
标记(相当于javadoc注释的.NET)来记录这些类。
答案 0 :(得分:14)
从XSD开始的建议是一个很好的建议。这并不能保证每一方的兼容性,因为XML Schema非常庞大,并且没有Web服务堆栈支持所有这些。 (例如:列表)。
所以,从XSD开始,但仅限于主流类型。基元,由基元组成的复杂类型,相同的数组。您可以安全地嵌套复杂类型和数组。 (复杂类型的数组,包含数组或复杂类型的复杂类型等)。
远离限制,替换组,列表,派生和任何其他XSD esoterica。甚至应该避免使用XSD枚举。
关于dateTime: 使用可以为空的日期时间是不够的。还有格式问题。 .NET DateTime的分辨率高于Java Calendar,因此,将.NET时间传递给Java可能会导致Java端出现反序列化异常。 (编辑:在.NET端的XmlElement属性中使用DataType =“dateTime”装饰器可以确保正确序列化)
Some old advice就此而言。
最后,您不能在生成的类上使用代码内XML文档。使用C#的部分类,您可以使用所需的in-code doc从生成的类中编写单独的代码。即使您重新生成代码,您的部分类代码也将保持不变。 编辑:编译时,文档将出现在类中。
编辑:有人问,如果使用XSD-first不足以保证互操作,为什么要使用它?我的回答:这不是保证,但这是一个很好的步骤,它有所帮助。它使您远离设计代码(Java或C#或VB等)的接口,这些接口暴露特定于.NET DataSet,泛型字典,Java ResultSets等特定于平台的东西,所有这些都会出现互操作问题。在XSD的边缘部分仍然存在缺陷,但通常可以避免那些设计周到的人。
我应该在原始答案中提到,您可以将迭代过程应用于界面的开发。在XSD中设计,然后从XSD + WSDL生成(客户端)存根和(服务器)框架代码,然后再调整并再次执行。
答案 1 :(得分:4)
使用basicHttpBinding端点将保证任何兼容SOAP 1.1的客户端都能够使用您的服务。
答案 2 :(得分:1)
使用DateTime ?,即可以为空的结构。 Java没有复杂值类型(即结构)的概念。我相信有些方法可以在WSDL中指定不允许空值,但我认为WCF不会开箱即用。
使用数组而不是集合。如果我没记错的话,集合类型在SOAP上的转换效果不是很好,但数组类型的表现相当不错。
您应该获得Eclispe或Netbeans的副本。创建原型WCF服务后,运行Web服务向导以创建代理。检查对象模型是否存在任何主要缺陷,特别强调复杂对象或非基本类型(将字符串视为基元)。
使用Netbeans或Eclipse做到这一点的学习曲线相当平坦,所以这不是一个巨大的负担。
编辑:其他潜在问题与绑定有关。如果你坚持使用HTTP(S),你应该很好......开始使用TCP或MSMQ之类的替代方案,你将不得不在Java中做很多工作。此外,某些安全功能在所有情况下都不会互操作,例如使用NTLM令牌......采用迭代方法。从没有安全性的简单HTTP w / SOAP绑定开始,然后从那里开始。
答案 3 :(得分:0)
WCF是否提供标准SOAP接口?如果确实如此,让Java与之交谈应该是一件轻而易举的事。
Re:Edit1:WSDL / XSD将使用标准的日期时间格式(Java端的Calendar,SOAP中的格式化日期时间字符串,.NET中的DateTime),或者您可以强制它为您的字符串格式自己选择。
阅读有关Java Web服务的Apache Axis(1.4和2.0)文档。使用Web服务将提供的wsdl / xsd设置Java Web服务客户端非常容易。
Edit3:在Java中,您将定义一个Java模型(包含所有您喜欢的文档),然后运行Java2WSDL(最好是作为ANT / Maven任务)来创建您的WSDL(但是我发现您需要手动重新排序字段在里面)。 Axis 2支持集合和枚举,Axis 1.4喜欢Arrays和手工推出的Java 1.4样式枚举。在这个WSDL中,您将使用WSDL2Java创建一个服务器端框架,其中您唯一需要做的就是实现业务逻辑。