Web服务(WSDL SOAP)返回空响应

4
我正在使用Visual Studio 2008 C# Windows应用程序连接到由外部公司创建的Web服务。该服务是一个WSDL URL,它是一个基本的SOAP请求和响应。我已将该服务导入为服务引用。我可以调用该服务,并且没有收到任何错误消息,但是响应为空。当在Fiddler中监视SOAP请求和响应时,我看到有一个响应返回,但好像VS无法解释响应。我尝试创建XSD文件,但得到一个错误,指定已经有一个模式。所以我完全不知道该怎么办。我希望有人可以帮忙解决。如果这个问题之前已经被解决了,我向大家道歉,但我找不到解决我的问题的任何信息。
提前感谢!
我使用以下代码连接服务:
 ServiceReference1.bpm bbb = new TestingWSDL.ServiceReference1.bpm();

        ServiceReference1.BPMExternalAppServicesV001Client soapClient = new TestingWSDL.ServiceReference1.BPMExternalAppServicesV001Client();

        ServiceReference1.DownloadShipmentDataV001 req = new TestingWSDL.ServiceReference1.DownloadShipmentDataV001();
        ServiceReference1.DownloadShipmentDataV001Response resp = new TestingWSDL.ServiceReference1.DownloadShipmentDataV001Response();

        try
        {

            soapClient.DownloadShipmentDataV001(req,out resp);

        }
        catch(Exception err)
        {
            MessageBox.Show(err.Message);
        }

响应对象中没有任何数据。由于未被允许,我无法发布图像。

WSDL非常长,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tns="http://schemas.ccc.com/AROPInventory/bpm/external" xmlns:inst="http://schemas.aaa.com/bpm/instance/1.0" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="BPMExternalAppServicesV001" targetNamespace="http://schemas.ccc.com/AROPInventory/bpm/external" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <xsd:schema xmlns:tns1="http://schemas.ccc.com/AROPInventory/bpm/external" xmlns="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://schemas.argility.com/AROPInventory/bpm/external" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="http://schemas.aaa.com/bpm/instance/1.0" />
      <xsd:element name="UploadShipmentDataV001">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="tns1:Shipments" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" name="Shipments">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="Shipment">
              <xsd:complexType>
                <xsd:sequence>
                  <xs:element name="ShipmentNumber" type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" />
                  <xsd:element name="Cartons">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element minOccurs="0" maxOccurs="unbounded" name="Carton">
                          <xsd:annotation>
                            <xsd:documentation>0:not damaged 1:damaged 2: Rejected0:not damaged 1:damaged 2: Rejected0:not damaged 1:damaged 2: Rejected</xsd:documentation>
                          </xsd:annotation>
                          <xsd:complexType>
                            <xsd:sequence>
                              <xs:element name="CartionID" type="xs:byte" xmlns:xs="http://www.w3.org/2001/XMLSchema" />
                              <xs:element name="Status" type="xs:byte" xmlns:xs="http://www.w3.org/2001/XMLSchema" />
                            </xsd:sequence>
                          </xsd:complexType>
                        </xsd:element>
                      </xsd:sequence>
                    </xsd:complexType>
                  </xsd:element>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="TestUploadShipMentV001">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="tns1:Shipments" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="TestUploadShipMentV001Response" />
      <xsd:element name="UploadShipmentDataV001Response" />
      <xsd:element name="DownloadShipmentDataV001">
        <xsd:complexType>
          <xsd:sequence />
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="DownloadShipmentDataV001Response">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="tns1:Shipments" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://schemas.aaa.com/bpm/instance/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="bpm">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="instance_id" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="DownloadShipmentDataV001Input">
    <wsdl:part name="body" element="tns:DownloadShipmentDataV001" />
  </wsdl:message>
  <wsdl:message name="DownloadShipmentDataV001Output">
    <wsdl:part name="body" element="tns:DownloadShipmentDataV001Response" />
  </wsdl:message>
  <wsdl:message name="HeaderOutput">
    <wsdl:part name="BPMHeader" element="inst:bpm" />
  </wsdl:message>
  <wsdl:portType name="BPMExternalAppServicesV001">
    <wsdl:operation name="DownloadShipmentDataV001">
      <wsdl:input message="tns:DownloadShipmentDataV001Input" />
      <wsdl:output message="tns:DownloadShipmentDataV001Output" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BPMExternalAppServicesV001" type="tns:BPMExternalAppServicesV001">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="DownloadShipmentDataV001">
      <soap:operation soapAction="" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
        <soap:header message="tns:HeaderOutput" part="BPMHeader" use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="BPMExternalAppServicesV001Service">
    <wsdl:port name="BPMExternalAppServicesV001Port" binding="tns:BPMExternalAppServicesV001">
      <soap:address location="http://aaa/aaa/com.eibus.web.soap.Gateway.wcp?organization=o=system,cn=aaa,cn=aaa,o=ho.bbb.co.za" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Fiddler的响应如下:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns="http://schemas.aaa.com/General/1.0/">
        <sender>
            <reply-to>
                cn=Business Process Management,cn=Business Process Management,cn=soap nodes,o=system,cn=aaa,cn=aaa20,o=ho.bbb.co.za
            </reply-to>
            <organizationalContext>o=system,cn=aaa,cn=aaa20,o=ho.bbb.co.za</organizationalContext>
            <component>cn=Business Process Management,cn=soap nodes,o=system,cn=aaa,cn=aaa20,o=ho.bbb.co.za</component>
        </sender>
        <receiver>
            <component>cn=webgateway@poc-aaa,cn=aaa,cn=aaa20,o=ho.bbb.co.za</component>
            <sent-to xmlns="http://schemas.aaa.com/General/1.0/">socket://poc-aaa:20379/</sent-to>
        </receiver>
        <msg-id>00505680-004E-11E1-FBF1-7CB604BB1FC0</msg-id>
    </header>
    <bpm xmlns="http://schemas.aaa.com/bpm/instance/1.0">
        <instance_id>26c34038-bea4-459c-a0ad-86b462ae90cb</instance_id>
    </bpm>
</s:Header>
<s:Body>
    <DownloadShipmentDataV001Response xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.argility.com/AROPInventory/bpm/external">
        <Shipments xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.argility.com/AROPInventory/bpm/external">
            <ShipmentHeader>
                <ShipmentNumber>S001</ShipmentNumber>
                <ReceivingBranch>B000028</ReceivingBranch>
                <SendingBranch>B000001</SendingBranch>
                <ExpectedDate>2012/07/30</ExpectedDate>
                <TotalNrOfCartons>2</TotalNrOfCartons>
                <ShipmentStatus>E</ShipmentStatus>
                <Cartons>
                    <Carton>
                        <CartonHeader>
                            <NrOfItems>2</NrOfItems>
                            <CartionID>99</CartionID>
                        </CartonHeader>
                        <CartonDetail>
                            <SKU>12345</SKU>
                            <Description>abc</Description>
                            <SerialNumber>6789</SerialNumber>
                            <QtySent>20</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                        <CartonDetail>
                            <SKU>12390</SKU>
                            <Description>abc</Description>
                            <SerialNumber>67232</SerialNumber>
                            <QtySent>2</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                    </Carton>
                    <Carton>
                        <CartonHeader>
                            <NrOfItems>2</NrOfItems>
                            <CartionID>100</CartionID>
                        </CartonHeader>
                        <CartonDetail>
                            <SKU>12345</SKU>
                            <Description>abc</Description>
                            <SerialNumber>6789</SerialNumber>
                            <QtySent>20</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                        <CartonDetail>
                            <SKU>12390</SKU>
                            <Description>abc</Description>
                            <SerialNumber>67232</SerialNumber>
                            <QtySent>2</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                    </Carton>
                </Cartons>
            </ShipmentHeader>
            <ShipmentHeader>
                <ShipmentNumber>S002</ShipmentNumber>
                <ReceivingBranch>B000029</ReceivingBranch>
                <SendingBranch>B000002</SendingBranch>
                <ExpectedDate>2012/06/3</ExpectedDate>
                <TotalNrOfCartons>21</TotalNrOfCartons>
                <ShipmentStatus>E</ShipmentStatus>
                <Cartons>
                    <Carton>
                        <CartonHeader>
                            <NrOfItems>3</NrOfItems>
                            <CartionID>91</CartionID>
                        </CartonHeader>
                        <CartonDetail>
                            <SKU>12345</SKU>
                            <Description>abc</Description>
                            <SerialNumber>6789</SerialNumber>
                            <QtySent>20</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                        <CartonDetail>
                            <SKU>12390</SKU>
                            <Description>abc</Description>
                            <SerialNumber>67232</SerialNumber>
                            <QtySent>2</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                    </Carton>
                    <Carton>
                        <CartonHeader>
                            <NrOfItems>1</NrOfItems>
                            <CartionID>97</CartionID>
                        </CartonHeader>
                        <CartonDetail>
                            <SKU>12390</SKU>
                            <Description>abc</Description>
                            <SerialNumber>67232</SerialNumber>
                            <QtySent>2</QtySent>
                            <QtyReceived/>
                        </CartonDetail>
                    </Carton>
                </Cartons>
            </ShipmentHeader>
        </Shipments>
    </DownloadShipmentDataV001Response>
</s:Body>
</s:Envelope>

如果您在Fiddler中发布响应,那么就会有更多的线索。一个可能性是Web服务的响应并不完全符合WSDL中指定的内容。这里常见的问题是命名空间不一致。您的解组器可能配置为使用WSDL中的命名空间,并忽略来自不同命名空间的响应元素。 - dcbyers
谢谢@dcbyers。我已经将Fiddler响应添加到原始问题中。 - Liz Engelke
3个回答

1

感谢您发布Fiddler收集的响应。实际上,我在WSDL和响应符合WSDL数据类型方面看到了不止一个问题。

第一个问题:WSDL一致性/完整性

请注意,输入和输出消息分别引用tns:DownloadShipmentDataV001tns:DownloadShipmentDataV001Responsexmlns:tns =“http://schemas.ccc.com/AROPInventory/bpm/external”是消息定义上下文中相关的前缀:命名空间绑定,因此请求和响应消息元素的完全限定名称分别为{http://schemas.ccc.com/AROPInventory/bpm/external}DownloadShipmentDataV001{http://schemas.ccc.com/AROPInventory/bpm/external}DownloadShipmentDataV001Response

通过 targetNamespace="http://schemas.argility.com/AROPInventory/bpm/external" 声明,WSDL 文档类型部分中定义的元素的完全限定名称为 {http://schemas.argility.com/AROPInventory/bpm/external}DownloadShipmentDataV001{http://schemas.argility.com/AROPInventory/bpm/external}DownloadShipmentDataV001Response。这是一个问题,因为消息定义中引用的实际类型在 WSDL 和任何导入/包含的文档中都缺失。

当尝试使用 WSDL 时,存根生成器应该会抱怨这个问题。

外部公司应该真正纠正这个问题,但您可以复制 WSDL 并通过声明类型部分中实际元素的命名空间并绑定到前缀来进行微调,然后在消息定义中使用该前缀(弱点是您需要额外的步骤来跟上其服务定义的任何更改):

xmlns:fromtype="http://schemas.argility.com/AROPInventory/bpm/external"
 ...
  <wsdl:message name="DownloadShipmentDataV001Input">
    <wsdl:part name="body" element="fromtype:DownloadShipmentDataV001" />
  </wsdl:message>
  <wsdl:message name="DownloadShipmentDataV001Output">
    <wsdl:part name="body" element="fromtype:DownloadShipmentDataV001Response" />
  </wsdl:message>

第二个问题:响应消息与模式不匹配

假设WSDL是一致的,并从类型部分调用了完全限定的数据类型。那么,响应消息的完全限定元素结构应该是类似于:

{http://schemas.argility.com/AROPInventory/bpm/external}DownloadShipmentDataV001Response
  {http://schemas.argility.com/AROPInventory/bpm/external}Shipments
    {http://schemas.argility.com/AROPInventory/bpm/external}Shipment
      {http://schemas.argility.com/AROPInventory/bpm/external}ShipmentNumber
      {http://schemas.argility.com/AROPInventory/bpm/external}Cartons
        {http://schemas.argility.com/AROPInventory/bpm/external}Carton
 ...

然而,响应消息中的实际结构为:

{http://schemas.argility.com/AROPInventory/bpm/external}DownloadShipmentDataV001Response
  {http://schemas.argility.com/AROPInventory/bpm/external}Shipments
    {http://schemas.argility.com/AROPInventory/bpm/external}ShipmentHeader
      {http://schemas.argility.com/AROPInventory/bpm/external}ShipmentNumber
 ...

请注意,ShipmentHeader在WSDL类型部分中从未声明为元素,也没有从其他文档导入。如果unmarshaller使用WSDL提供的数据类型定义,则无法理解ShipmentHeader或其子元素,因此可能会将其排除在外(正如您所看到的)。
解决此问题的方法是将数据类型模式定义与服务实际响应相匹配。再次强调,托管服务的外部组织应该进行更正(他们的服务不符合给定的WSDL),但是您可以通过采取额外步骤来使“您”的wsdl与其服务保持同步。
希望这可以帮助您,并请回复进一步的问题。

非常感谢。我已经标记了你的答案,因为我已经和一些更有经验的同事交流过,并得到他们的认可。我已经将信息发送给开发该服务的公司,他们将为我纠正这个问题。 - Liz Engelke

0

您仍需要自己解析此XML文件。

我们在IBM的Remedy软件中遇到了类似的问题。基本上,这是一款糟糕的软件,应该预料到会出现这种行为。即使他们更新代码以匹配实际的XML文档,他们也没有从实际的XML文档生成WSDL...除非他们改变方法,否则这个问题将继续存在,而您无法控制。


0

我曾经遇到过类似的问题,即使在 Fiddler 中显示为空白答案,但实际上却相反。我通过删除 System.ServiceModel.XmlSerializerFormatAttribute 属性来解决这个问题,并成功序列化响应。虽然不是最优解,但对我来说可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接