代码之家  ›  专栏  ›  技术社区  ›  whaley

代码优先.NET Web服务使用SOAP编码-如何防止这种情况?

  •  1
  • whaley  · 技术社区  · 15 年前

    当从.NET接口生成wsdls时,如何配置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>
    

    这无法在cxf中使用wsdl2java进行解析,cxf是一个jax-ws实现,原因是soapenc:array位。修复方法是将上述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 回复  |  直到 15 年前
        1
  •  2
  •   Keith    15 年前

    这是一个问题,一个是6,另一个是12/2——wsdl2java没有像微软的WSDL实现所认为的那样正确地支持任何复杂的类型。

    讨论这是否是Java或MS的错误是没有意义的。

    不幸的是,除了基本类型之外,很少有SOAP的实现可以处理其他任何东西,因此,虽然从表面上看,Microsoft Web服务看起来很好地实现了互操作性,但实际上它们只与Microsoft的代理一起工作。

    对于您的解决方案,您有几个选项:

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

    2. 自己写 HttpHandler 以Java可以处理的格式返回XML——实际上我在处理Flex/ActionScript时遇到了类似的问题(同样的问题)。

    3. 使用一种不同的格式-imho大多数Web正在从SOAP转向REST风格的服务。

    其中(1)是最简单的,但也是最笨拙的。最终,HAKS就像一个WDSL描述的SOAP方法,它返回一个字符串,但是该字符串实际上是被消费Java解析的编码XML。大笑。

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