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

问题描述:

我有一个web服务(不受我的控制),我必须与之交谈。我也有一个包嗅探器在线,而web服务的开发人员并没有说谎。我在正确的字段中看到数据。当实际服务返回数据时,为什么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字段始终为空。我做错了什么?

UPDATE: 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> 

你不得不发布WSDL,我可以肯定的,但“Web服务返回NULL”几乎总是意味着有一个争议关于XML命名空间 - 该服务正在向您发送一个名称空间中的数据,并且.NET期望有一个不同的命名空间。

在这种情况下,请注意,尽管包装元素位于http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch名称空间中,但大部分响应都位于默认名称空间中。

+0

好主意......我碰过你的答案,因为这是一个很好的选择。但是,我可以伪造一个数据包,并伪造他们的数据包,并在各处更改名称空间。这似乎不是问题。它不会崩溃,并且对象本身不是NULL。对象内的项目为空。 – Jerry 2010-04-14 14:35:32

+0

@Jerry:我会尝试在午餐时更详细地看看这一点 - 但我不得不说,WSDL并不会显示通常表示混合命名空间的符号。与此同时,如果您可以查看您的Reference.cs文件并查看哪些名称空间已放置在元素上,并与XML进行比较,那就太好了。 – 2010-04-14 17:31:22

+1

与开发人员合作,让他们给我一个新的WSDL。 (你发誓我要求他们发送*机密)。最终明白了,你不知道,这是不同的。显然,每个项目现在是一个项目的数组,而不是一个项目,因此为什么它是空的...... .NET无法确定类型,所以它留空。 – Jerry 2010-04-14 18:44:26

确保您的服务参考资料是最新的。当服务WSDL改变但引用未被更新时,这发生在我们身上。