Code First .NET Web服务使用soap编码 - 如何防止这种情况?

时间:2009-08-25 13:50:33

标签: .net wsdl asmx jax-ws wsdl2java

在从.NET接口生成wsdl时,如何将asp.net / asmx配置为不使用soap编码?简而言之,.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>

由于soapenc:Array位,这无法在CXF中解析wsdl2java,这是一个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>

1 个答案:

答案 0 :(得分:2)

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

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

不幸的是,很少有SOAP的实现可以处理除基本类型之外的任何内容,因此虽然Microsoft Web Services看起来非常适合表面上的可互操作性,但它们实际上只能与Microsoft的代理一起使用。

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

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

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

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

  4. 其中(1)是最简单的,也是最笨重的。您最终会遇到像WDSL描述的SOAP方法那样返回字符串的黑客,但该字符串实际上是消费Java可以解析的编码XML。育。

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