.net调用java生成的ws R2718的问题

java工程,使用easywsdl生成发布的WebService的wsdl。并使用SDO的服务数据对象模型,对数据进行描述。

生成的wsdl使用vs2010的visual studio命令提示行,使用wsdl out命令生成C#相关的调用文件,发现后台会抛出如下信息:

警告: 此 Web 引用不符合 WS-I Basic Profile v1.1。
R2718: 说明中的 wsdl:binding 必须与所引用的 wsdl:portType 包含一组相同的 wsdl:operations。
  -  来自命名空间“http://www.com/esb/ComponentService1”的 portType“Com
ponentService1Interface”上的操作“operation1”没有匹配的绑定。
  -  在来自命名空间“http://www.com/esb/ComponentService1”的 portType“C
omponentService1Interface”上,没有与来自命名空间“http://www.com/esb/Com
ponentService1”的绑定“ComponentService1Soap11”上的操作“operation1”相匹配的
操作。
  -  在来自命名空间“http://www.com/esb/ComponentService1”的 portType“C
omponentService1Interface”上,没有与来自命名空间“http://www.com/esb/Com
ponentService1”的绑定“ComponentService1Soap11”上的操作“operation1”相匹配的
操作。

有关 WS-I Basic Profile v1.1 的更多详细信息,请参阅位于以下位置的规范:
http://www.ws-i.org/Profiles/BasicProfile-1.1.html。

错误: 无法从命名空间“http://www.com/esb/ComponentService1”导入绑定“Com
ponentService1Soap11”。
  - 来自命名空间“http://www.com/esb/ComponentService1”的 portType“Comp
onentService1Interface”上的操作“operation1”存在以下语法错误: 此操作没有匹配的
绑定。请检查 Binding 节中的操作、输入和输出的名称是否与 PortType 节中的相应名称
相匹配。

看起来是生成的WSDL不符合ws的某些规范(.Net对这些东西的验证真严格),但是,在java下从没碰到过此类问题。

研究相关规范及网络资源学习,发现问题根本原因在于wsdl文件中的以下“portType”片段的描述:

  <ns1:portType name="ComponentService1Interface">
    <ns1:operation name="operation1">
      <ns1:input message="ns8:operation1" name="operation1">
    </ns1:input>
      <ns1:output message="ns8:operation1Response" name="operation1Response">
    </ns1:output>
    </ns1:operation>
  </ns1:portType>
与后续的“binding”部分的描述:

  <ns1:binding name="ComponentService1Soap11" type="ns8:ComponentService1Interface">
    <ns3:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <ns1:operation name="operation1">
      <ns3:operation soapAction="http://www.com/esb/ComponentService1/operation1" style="document"/>
      <ns1:input>
        <ns3:body use="literal"/>
      </ns1:input>
      <ns1:output>
        <ns3:body use="literal"/>
      </ns1:output>
    </ns1:operation>
  </ns1:binding>
两者的“input”与“output”的相关内容,name属性不一致(所谓不一致,即前者有name属性值,后者没有)。
试过之后,发现有两种解决方案:

1、去掉前者的input与output的name属性值。

2、在后者的input与output中添加与前者相同的name属性值。

即调整后的片段为:

  <ns1:portType name="ComponentService1Interface">
    <ns1:operation name="operation1">
      <ns1:input message="ns8:operation1">
    </ns1:input>
      <ns1:output message="ns8:operation1Response">
    </ns1:output>
    </ns1:operation>
  </ns1:portType>
  <ns1:binding name="ComponentService1Soap11" type="ns8:ComponentService1Interface">
    <ns3:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <ns1:operation name="operation1">
      <ns3:operation soapAction="http://www.apusic.com/esb/ComponentService1/operation1" style="document"/>
      <ns1:input>
        <ns3:body use="literal"/>
      </ns1:input>
      <ns1:output>
        <ns3:body use="literal"/>
      </ns1:output>
    </ns1:operation>
  </ns1:binding>

  <ns1:portType name="ComponentService1Interface">
    <ns1:operation name="operation1">
      <ns1:input message="ns8:operation1" name="operation1">
    </ns1:input>
      <ns1:output message="ns8:operation1Response" name="operation1Response">
    </ns1:output>
    </ns1:operation>
  </ns1:portType>
  <ns1:binding name="ComponentService1Soap11" type="ns8:ComponentService1Interface">
    <ns3:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <ns1:operation name="operation1">
      <ns3:operation soapAction="http://www.apusic.com/esb/ComponentService1/operation1" style="document"/>
      <ns1:input name="operation1">
        <ns3:body use="literal"/>
      </ns1:input>
      <ns1:output name="operation1Response">
        <ns3:body use="literal"/>
      </ns1:output>
    </ns1:operation>
  </ns1:binding>
总之,就是需要两者的input与output的属性保持完全的一致。

你可能感兴趣的:(Web,wsdl,webservice,BAS,此,WS-I,R2718,引用不符合)