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

当实际服务返回数据时,webservice为什么会返回空值?

  •  5
  • Jerry  · 技术社区  · 16 年前

    我有一个网络服务(我无法控制),我必须与之交谈。我也有一个包嗅探器在运行,而webservice的开发人员并没有撒谎。我在正确的字段中看到数据。

    他们实际上正在发回我要求的所有数据。但是从wsdl文件自动生成的web服务代码给了我一个值“null”。

    更新: 为了澄清,返回的对象不为空。对象中的元素为空。我不知道这对谁有帮助。我完全被难住了。

    我使用他们的wsdl文件生成我的web引用。我用wsdl文件声明的数据类型检查了我的数据类型。我使用下面列出的代码执行调用:

    DT_MaterialMaster_LookupRequest req = new DT_MaterialMaster_LookupRequest();
    req.MaterialNumber = "101*";
    req.DocumentNo = "";
    req.Description = "Pipe*";
    req.Plant = "0000";
    
    MI_MaterialMaster_Lookup_OBService srv = new MI_MaterialMaster_Lookup_OBService();
    
    DT_MaterialMaster_Response resp = 
        srv.MI_MaterialMaster_Lookup_OB(new DT_MaterialMaster_LookupRequest[] { req });
    
    
    // Note that the response here is ALWAYS null!!
    Console.WriteLine(resp.Status);
    

    resp对象是实际对象。它是正确生成的。但是,status和materialdata字段始终为空。

    当我调用web服务时,我已经在线路上放置了一个数据包嗅探器,我可以看到我已经发送了以下内容(换行符和缩进符,以保持我的理智):

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <MT_MaterialMaster_Lookup 
            xmlns="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch">
            <Request xmlns="">
                <MaterialNumber>101*</MaterialNumber>
                <Description>Pipe*</Description>
                <DocumentNo />
                <Plant>0000</Plant>
            </Request>
        </MT_MaterialMaster_Lookup>
    </soap:Body>
    </soap:Envelope>
    

    他们发回的响应似乎是有效的响应(换行符和缩进表示我的理智):

    <SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'>
    <SOAP:Header />
        <SOAP:Body>
            <n0:MT_MaterialMaster_Response
               xmlns:n0='http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch'
               xmlns:prx='urn:SomeCompany.com:proxy:BRD:/1SAI/TAS4FE14A2DE960D61219AE:701:2009/02/10'>
            <Response>
                <Status>No Rows Found</Status>
                <MaterialData />
            </Response>
        </n0:MT_MaterialMaster_Response>
    </SOAP:Body>
    </SOAP:Envelope>
    

    状态显示它实际上收到了数据…但是resp.status和resp.materialdata字段始终为空。我做错了什么?

    更新: wsdl文件定义为:

    <?xml version="1.0" encoding="utf-8"?>
    <wsdl:definitions xmlns:p1="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" name="MI_MaterialMaster_Lookup_OB" targetNamespace="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
      <wsdl:types>
        <xsd:schema xmlns="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" 
            targetNamespace="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <xsd:element name="MT_MaterialMaster_Response" type="p1:DT_MaterialMaster_Response" />
          <xsd:element name="MT_MaterialMaster_Lookup" type="p1:DT_MaterialMaster_Lookup" />
          <xsd:complexType name="DT_MaterialMaster_Response">
        <xsd:sequence>
          <xsd:element name="Status" type="xsd:string">
            <xsd:annotation>
              <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b040af11df99e300145eccb24e</xsd:appinfo>
            </xsd:annotation>
          </xsd:element>
          <xsd:element maxOccurs="unbounded" name="MaterialData">
            <xsd:annotation>
              <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa040a511df843700145eccb24e</xsd:appinfo>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
            <xsd:element name="MaterialNumber" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa140a511df848500145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Description" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa240a511df95bf00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="DocumentNo" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa340a511dfb23700145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="UOM" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">3b5f14c040a611df9fbe00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Hierarchy" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa440a511dfc65b00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Plant" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b140af11dfb78e00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Procurement" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b240af11dfb87b00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="DT_MaterialMaster_Lookup">
        <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="Request">
            <xsd:annotation>
              <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa040a511df843700145eccb24e</xsd:appinfo>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
            <xsd:element minOccurs="0" name="MaterialNumber" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa140a511df848500145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Description" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa240a511df95bf00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="DocumentNo" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa340a511dfb23700145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
            <xsd:element minOccurs="0" name="Plant" type="xsd:string">
              <xsd:annotation>
                <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa440a511dfc65b00145eccb24e</xsd:appinfo>
              </xsd:annotation>
            </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
          </xsd:complexType>
        </xsd:schema>
      </wsdl:types>
      <wsdl:message name="MT_MaterialMaster_Lookup">
        <wsdl:part name="MT_MaterialMaster_Lookup" element="p1:MT_MaterialMaster_Lookup" />
      </wsdl:message>
      <wsdl:message name="MT_MaterialMaster_Response">
        <wsdl:part name="MT_MaterialMaster_Response" element="p1:MT_MaterialMaster_Response" />
      </wsdl:message>
      <wsdl:portType name="MI_MaterialMaster_Lookup_OB">
        <wsdl:operation name="MI_MaterialMaster_Lookup_OB">
          <wsdl:input message="p1:MT_MaterialMaster_Lookup" />
          <wsdl:output message="p1:MT_MaterialMaster_Response" />
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="MI_MaterialMaster_Lookup_OBBinding" type="p1:MI_MaterialMaster_Lookup_OB">
        <binding transport="http://schemas.xmlsoap.org/soap/http" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
        <wsdl:operation name="MI_MaterialMaster_Lookup_OB">
          <operation soapAction="http://SomeCompany.com/xi/WebService/soap1.1" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
          <wsdl:input>
        <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
          </wsdl:input>
          <wsdl:output>
        <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="MI_MaterialMaster_Lookup_OBService">
        <wsdl:port name="MI_MaterialMaster_Lookup_OBPort" binding="p1:MI_MaterialMaster_Lookup_OBBinding">
          <address location="http://bxdwas.MyCompany.com/XISOAPAdapter/MessageServlet?channel=:SOAP_SND_Material_Lookup" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    
    2 回复  |  直到 10 年前
        1
  •  6
  •   John Saunders    16 年前

    为了让我确信,您必须发布wsdl,但是“web服务返回null”几乎总是意味着关于xml名称空间的争论-服务在一个名称空间中向您发送数据,而.net则期望一个不同的名称空间。

    在本例中,请注意大多数响应都在默认命名空间中,即使包装器元素位于 http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch 命名空间。

        2
  •  2
  •   Amy    16 年前

    确保您的服务参考是最新的。当服务wsdl更改但引用未更新时,就会发生这种情况。