【问题标题】:Guaranteeing that a .NET WCF Service can be consumed by a Java client保证 Java 客户端可以使用 .NET WCF 服务
【发布时间】:2009-03-27 15:18:11
【问题描述】:

我正在创建将由 .NET 和 Java 客户端应用程序使用的 WCF 服务。

我们在团队中没有任何 Java 经验,因此正在寻找要遵循的准则或规则,以确保我们不会在 WCF 服务接口中意外包含任何类型或做任何其他会阻止它被Java 客户端应用程序。

我们的担忧有根据吗?如果有,我们应该注意什么?

编辑

一个值得关注的例子是 .NET DateTime 值是否以 Java 客户端可以正确理解的方式在服务接口中表示。

编辑2

第二个问题的例子是使用任何可为空的值类型(bool?int? 等)。

编辑3

目前我们的一些开发团队正在手写 .xsd 文件来定义 WCF 接口方法将作为参数并作为返回值返回的各种对象。然后他们使用 xsd.exe 从这些文件中自动生成 C# 类。

这背后的基本原理是它保证生成的类不会包含任何特定于 .NET 的内容。

缺点是这增加了开发负担,也使我们无法使用<summary> 标签(.NET 等效于 javadoc cmets)记录这些类。

【问题讨论】:

    标签: java .net wcf


    【解决方案1】:

    从 XSD 开始的建议是一个很好的建议。这并不能保证双方的兼容性,因为 XML Schema 非常大,而且没有 Web 服务堆栈支持所有这些。 (例如:列表)。

    所以,从 XSD 开始,但仅限于主流类型。基元,由基元组成的复杂类型,相同的数组。您可以安全地嵌套复杂类型和数组。 (复杂类型的数组、包含数组或复杂类型的复杂类型等)。

    远离限制、替换组、列表、派生和任何其他 XSD 秘密。甚至应该避免使用 XSD 枚举。

    关于日期时间: 使用可为空的日期时间是不够的。还有格式问题。 .NET DateTime 比 Java 日历具有更高的分辨率,因此,将 .NET 时间传送到 Java 可能会导致 Java 端出现反序列化异常。 (编辑:在 .NET 端的 XmlElement 属性中使用 DataType="dateTime" 装饰器可以确保您正确序列化)

    Some old advice 那个。

    最后,不能在生成的类上使用代码内 XML 文档是不正确的。使用 C# 的部分类,您可以使用所需的代码内文档从生成的类中编写单独的代码。即使您重新生成代码,您的部分类代码也将保持不变。 编辑:当你编译时,文档会出现在类中。

    编辑: 有人问,如果使用 XSD-first 不足以保证互操作性,为什么要使用它?我的回答:这不是保证,但这是一个很好的步骤,它有帮助。它使您远离在代码(Java 或 C# 或 VB 等)中设计接口,这些接口暴露了特定于平台的东西,如 .NET 数据集、通用字典、Java 结果集等,所有这些都存在互操作问题。 XSD 的边缘部分仍然存在缺陷,但您通常可以避免那些经过深思熟虑的设计。

    我应该在我的原始答案中提到,您可以将迭代过程应用于接口的开发。在 XSD 中设计,然后从 XSD+WSDL 生成(客户端)存根和(服务器)骨架代码,然后调整并再次执行。

    【讨论】:

      【解决方案2】:

      使用basicHttpBinding 端点将保证任何与 SOAP 1.1 兼容的客户端都能够使用您的服务。

      【讨论】:

      • 使用什么绑定不是由客户决定的吗?
      • 不,是服务器决定使用什么协议、绑定。客户必须遵守。
      • 查看这篇文章:romenlaw.blogspot.com/2008/07/…
      【解决方案3】:

      使用 DateTime?,即可以为空的结构。 Java 没有复杂值类型(即结构)的概念。我相信有一些方法可以在 WSDL 中指定不允许空值,但我认为 WCF 并没有开箱即用。

      使用数组而不是集合。如果我没记错的话,集合类型在 SOAP 上的转换效果不是很好,但数组类型做得很好。

      您应该获得一份 Eclispe 或 Netbeans。创建原型 WCF 服务后,运行 Web 服务向导来创建代理。检查对象模型是否存在任何重大缺陷,特别强调复杂对象或非原始类型(将字符串视为原始类型)。

      使用 Netbeans 或 Eclipse 进行此操作的学习曲线相当平坦,因此负担不是很大。

      编辑:其他潜在问题与绑定有关。如果你坚持使用 HTTP(S),你应该会很好......开始使用 TCP 或 MSMQ 等替代方案,你将不得不在 Java 中做很多工作。此外,某些安全功能并非在所有情况下都可以互操作,例如使用 NTLM 令牌……采用迭代方法。从一个没有安全性的简单 HTTP w/SOAP 绑定开始,然后从那里开始。

      【讨论】:

      • 感谢 James 的指点 - 我仍然希望为此提供一种非试错法
      • 你比我勇敢很多。
      • 不知道勇敢...我只想知道什么是允许的,什么是不允许的。 :-)
      【解决方案4】:

      WCF 是否提供标准的 SOAP 接口?如果是这样,让 Java 与之对话应该是轻而易举的事。

      Re: Edit1: WSDL / XSD 将使用标准日期时间格式(Java 端的日历、SOAP 中的格式化日期时间字符串、.NET 中的日期时间),或者您可以将其强制为您的字符串格式自己选择。

      阅读有关 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 喜欢数组和手动 Java 1.4 风格的枚举。通过这个 WSDL,您将使用 WSDL2Java 创建一个服务器端框架,您唯一需要做的就是实现您的业务逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多