2011-11-29 89 views
1

我有一個webservices,我已經將它添加到我的.NET項目中作爲web參考。其中一種web方法返回一個嵌套數組(NameValuePairDTOArray [NameValuePairDTO [])。我只能在.NET代碼中獲得空對象,但是當我通過SoapUI測試時它確實返回了數據。.NET調用webservices並返回空值

我在這裏粘貼了一部分wsdl文件。

這是方法定義。

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://services.mymachine.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IneteractionService" targetNamespace="http://services.mymachine.com/"> 
    <operation name="getValue" parameterOrder="parameters"> 
     <input message="tns:MyServices_getValues"/> 
     <output message="tns:MyServices_getValuesResponse"/> 
     <fault message="tns:ServiceException" name="ServiceException"/> 
    </operation> 

    <xs:schema xmlns:ns1="http://ods.mymachine.com/v1_0_0" xmlns:tns="http://services.mymachine.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.mymachine.com/" version="1.0"> 
     <xs:import namespace="http://ods.mymachine.com/v1_0_0"/> 
     <xs:element name="ServiceException" type="tns:ServiceException"/> 
     <xs:element name="getValue" type="tns:getValue"/> 
     <xs:element name="getValuesResponse" type="tns:getValuesResponse"/> 
     <xs:complexType name="getValue"> 
      <xs:sequence> 
      <xs:element minOccurs="0" name="firstName" type="xs:string"/> 
      <xs:element minOccurs="0" name="lastName" type="xs:string"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:complexType name="getValuesResponse"> 
      <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="ns1:NameValuePairDTOArray"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:schema> 
</definitions> 

這是響應數據的定義。

<xs:schema xmlns:ns1="http://common.mymanchine.com/v1_0_0" xmlns:tns="http://ods.mymachine.com/v1_0_0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://ods.mymachine.com/v1_0_0" version="1.0"> 
    <xs:import namespace="http://common.mymanchine.com/v1_0_0"/> 
    <xs:complexType final="#all" name="NameValuePairDTOArray"> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" minOccurs="0" name="item" nillable="true" type="tns:NameValuePairDTO"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="NameValuePairDTO"> 
     <xs:complexContent> 
      <xs:extension base="ns1:DataTransferObject"> 
       <xs:sequence/> 
       <xs:attribute name="name" type="xs:string"/> 
       <xs:attribute name="value" type="xs:string"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema 

由.NET生成的代理類是這樣的:

[WebServiceBinding(Name = "InteractionServicesBinding", Namespace = "http://services.mymachine.com/")] 
[XmlInclude(typeof(DataTransferObject))] 
[DebuggerStepThrough] 
[GeneratedCode("System.Web.Services", "4.0.30319.1")] 
[DesignerCategory("code")] 
public class InteractionServicesServiceWse : WebServicesClientProtocol 
{ 
    public InteractionServicesServiceWse(); 

    [SoapDocumentMethod("", RequestNamespace = "http://services.mymachine.com/", 
    ResponseNamespace = "http://services.services.mymachine.com/", Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] 
    public NameValuePairDTOArray[] getValue(string firstName, string lastName); 
} 

[Serializable] 
[XmlType(Namespace = "http://ods.mymachine.com/v1_0_0")] 
[GeneratedCode("System.Xml", "4.0.30319.233")] 
[DebuggerStepThrough] 
[DesignerCategory("code")] 
public class NameValuePairDTOArray 
{ 
    public NameValuePairDTOArray(); 

    [XmlElement("item", IsNullable = true)] 
    public NameValuePairDTO[] item { get; set; } 
} 

[Serializable] 
[DesignerCategory("code")] 
[XmlType(Namespace = "http://ods.mymachine.com/v1_0_0")] 
[GeneratedCode("System.Xml", "4.0.30319.233")] 
[DebuggerStepThrough] 
public class NameValuePairDTO : DataTransferObject 
{ 
    public NameValuePairDTO(); 

    [XmlAttribute] 
    public string name { get; set; } 
    [XmlAttribute] 
    public string value { get; set; } 
} 

現在如果我叫的getValue( 「約翰福音」, 「彼得」),它會如下面的.NET返回。

enter image description here

但soapUI的返回是這樣的:

<env:Body> 
    <ns2:getValueResponse xmlns:ns2="http://services.mymachine.com/"> 
    <return> 
     <item value="123" name="BONUS_ID"/> 
     <item value="456" name="POPUP_OBJECT_ID"/> 
    </return> 
    <return> 
     <item value="123" name="BONUS_ID"/> 
     <item value="567" name="POPUP_OBJECT_ID"/> 
    </return> 
    </ns2:getValueResponse> 
</env:Body> 

看來,.NET不能檢測NameValuePairDTO /產品陣列。

怎麼了?

+0

自添加服務參考以來,您是否對服務進行過任何更改? – cadrell0

回答

2

嗯,問題原來是服務器端出現問題。

該模式定義了NameValuePairDirArray和NameValuePairDTO是quailifed。

但看看響應XML,

<env:Body> 
    <ns2:getValueResponse xmlns:ns2="http://services.mymachine.com/"> 
    <return> 
     <item value="123" name="BONUS_ID"/> 
     <item value="456" name="POPUP_OBJECT_ID"/> 
    </return> 
    <return> 
     <item value="123" name="BONUS_ID"/> 
     <item value="567" name="POPUP_OBJECT_ID"/> 
    </return> 
    </ns2:getValueResponse> 

返回(NameValuePairDTOArray)和項目(NameValuePairDTO)不合格。生成的代理類假定它們是合格的,因爲已定義模式,但這導致無法分析xml。

快速修復將手動添加到NameValuePairDTOArray類的NameValuePairDTO屬性的unqualifed屬性。將來,服務端應該修復此問題。

1

您生成的代碼中的NameValuePairDTOArray出現的名稱空間爲「http://ods.mymachine.com/v1_0_0」,但該名稱空間不在xml輸出中(因此.net不知道該標記「return」指的是一個NameValuePairDTOArray)。

也許你從服務器的代碼中刪除了XmlTypeAttribute。

因此,您應該:在客戶端刷新您的Web引用或在服務器端添加XmlTypeAttribute。

+0

我也注意到了這一點,並改變了wsdl文件,但它沒有奏效。 –

+1

問題不在於wsdl文件,而在於您的Web服務返回的xml:您的服務器不尊重它創建的協議(wsdl文件) –