1

从 .NET 接口生成 wsdls 时,如何将 asp.net / asmx 配置为根本不使用肥皂编码?简而言之,一个.NET SOAP Web 服务正在生成一个包含soap 编码的wsdl。例如:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
    <s:complexContent mixed="false">
      <s:restriction base="soapenc:Array">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
      </s:restriction>
    </s:complexContent>
  </s:complexType>
</s:schema>

这无法使用 CXF 中的 wsdl2java 进行解析,这是由于 soapenc:Array 位而导致的 JAX-WS 实现。解决方法是将上面的 xml 更改为:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
  </s:complexType>
</s:schema>
4

1 回答 1

2

这是一个问题,一个是 6,另一个是 12/2 - wsdl2java 不能像 Microsoft 的 WSDL 实现所认为的那样正确支持任何复杂类型。

关于这是Java还是MS的错的讨论有点毫无意义。

不幸的是,很少有 SOAP 实现可以处理原始类型以外的任何内容,因此虽然 Microsoft Web 服务在表面上看起来非常适合互操作性,但它们实际上只与 Microsoft 的代理一起工作。

对于您的解决方法,您有几个选择:

  1. 坚持原始的 .Net 类型 - 基本上是值类型 + 字符串。没有数组、列表或任何具有复杂序列化的东西。

  2. 编写您自己的HttpHandler以 Java 可以处理的格式返回 Xml - 我在处理 Flex/ActionScript(有同样的问题)时实际上做过类似的事情。

  3. 使用不同的格式 - 恕我直言,大多数网络正在从 SOAP 转向 REST 样式服务。

其中 (1) 是最简单的,但也是最笨重的。您最终会得到类似 WDSL 描述的返回字符串的 SOAP 方法的技巧,但该字符串实际上是使用 Java 可以解析的编码 XML。玉。

在跨平台工作时,你总是会得到这样有趣的东西:-(

于 2009-08-28T11:19:35.773 回答