2012-02-20 33 views
1

我正在使用kso​​ap2庫連接到wcf Web服務。當我嘗試發送原始類型時,服務器獲取這些值併發送正確的響應。但是,如果我嘗試發送複雜類型(作爲KVMSerilizable的子類型的對象),則服務器會收到空值。 下面是我想發送的對象的類定義。從android客戶端發送複雜類型到wcf服務時,服務器接收到null

import java.util.Hashtable; 

import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class TwoIntegerWrapper implements KvmSerializable { 

    private int Num1; 
    private int Num2; 

    public TwoIntegerWrapper() { 
     super(); 
    } 

    TwoIntegerWrapper(int number1, int number2) { 
     super(); 
     this.Num1 = number1; 
     this.Num2 = number2; 
    } 

    public int getNumber1() { 
     return Num1; 
    } 

    public void setNumber1(int number1) { 
     this.Num1 = number1; 
    } 

    public int getNumber2() { 
     return Num2; 
    } 

    public void setNumber2(int number2) { 
     this.Num2 = number2; 
    } 

    public Object getProperty(int propertyNumber) { 

     Object property = null; 

     switch (propertyNumber) { 
     case 0: 
      property = this.Num1; 
      break; 

     case 1: 
      property = this.Num2; 
      break; 

     } 

     return property; 
    } 

    public int getPropertyCount() { 
     return 2; 
    } 

    public void getPropertyInfo(int propertyNumber, Hashtable arg1, 
      PropertyInfo propertyInfo) { 

     switch (propertyNumber) { 
     case 0: 
      propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
      propertyInfo.name = "Num1"; 
      break; 
     case 1: 
      propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
      propertyInfo.name = "Num2"; 
      break; 
     } 

    } 

    public void setProperty(int propertyNumber, Object data) { 
     switch (propertyNumber) { 

     case 0: 
      this.Num1 = Integer.parseInt(data.toString()); 
      break; 
     case 1: 
      this.Num2 = Integer.parseInt(data.toString()); 
      break; 
     } 

    } 
} 

這裏是我如何調用Web服務。

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

PropertyInfo property = new PropertyInfo(); 
TwoIntegerWrapper tiw = new TwoIntegerWrapper(num1Value, num2Value); 

property.setName("TwoIntegerWrapper"); 
property.setType(tiw.getClass()); 
property.setValue(tiw); 

request.addProperty(property); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true; 
envelope.setOutputSoapObject(request); 

envelope.addMapping(NAMESPACE, tiw.getClass().getSimpleName(), TwoIntegerWrapper.class); 

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
androidHttpTransport.debug = true; 

try { 
    androidHttpTransport.call(Add_SOAP_ACTION, envelope); 

    Log.d(logtag + " request dump", androidHttpTransport.requestDump); 
    Log.d(logtag + " response dump", androidHttpTransport.responseDump); 


    SoapPrimitive sp = (SoapPrimitive) envelope.getResponse(); 
    result = Integer.parseInt(sp.toString()); 
} 

有什麼可能的原因?

+0

後您的一些WSDL和重量誤差被退回如果有的話 – shadesco 2012-02-20 22:43:03

+0

服務器收到一個空對象。我的請求轉儲是以下 1 3 iargin 2012-02-21 09:25:45

+0

我將需要查看您的wsdl ,而不是requestDump,至少是「TwoIntegerWrapper」的消息部分,以查看在上面的代碼定義中是否有任何錯誤 – shadesco 2012-02-21 15:20:20

回答

0

我發現該溶液通過改變爲getPropertyInfo的功能TwoIntegerWrapper班。我還爲這個類中的每個屬性設置了命名空間。新的實現如下:

public void getPropertyInfo(int propertyNumber, Hashtable arg1, 
     PropertyInfo propertyInfo) { 

    switch (propertyNumber) { 
    case 0: 
     propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
     propertyInfo.name = "Num1"; 
     propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE); 
     break; 
    case 1: 
     propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
     propertyInfo.name = "Num2"; 
     propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE); 
     break; 
    } 

} 

即使我從信封中刪除映射,它的工作原理。我無法理解爲什麼會這樣,但它有效。我很感激,如果有人解釋原因。 WSDL文件,xsd0,xsd1和xsd2文件中的鏈接http://www.ceng.metu.edu.tr/~e1559897/

順便說一句,我也改變

property.setName("TwoIntegerWrapper"); 

property.setName("obj"); 
+0

您可以讓我知道,「TWO_INTEGER_WRAPPER_NAMESPACE」的價值是什麼。我面臨同樣的問題。 – Sandy 2013-07-31 07:25:08

1

這樣做的一個常見問題是,假設您在連線上發送XML,則XML位於錯誤的名稱空間中。在這種情況下,WCF解串器將決定它在XML中不知道什麼,並返回null

+0

N amespace是正確的。如果沒有,會發送原始類型的工作? (導致它與原始類型一起工作。) – iargin 2012-02-20 14:28:26

+0

您是否控制該服務?如果是這樣,你可以打開消息日誌記錄和跟蹤,看看服務方面發生了什麼 – 2012-02-20 17:21:13

0

我建議檢查請求並使用Fiddler來響應。

在您的WCF服務上啓用Tracing並通過檢查跟蹤文件來查看通道上出現的消息。

0

確定您的類實現kvmserializable是準確的基於xsd2。 但是,你有AddNumbers2方法(消息),AddNumbers3有第一元素它有一個元素類型複雜類型,例如:

<xs:element name="AddNumbers2"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="obj" nillable="true" type="q1:TwoIntegerWrapper"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

所以,你應該做的是:

property.setName("AddNumbers2");//not TwoIntegerWrapper, coz the main property is AddNumbers2 
property.setType(tiw.getClass()); 
property.setValue(tiw); 
request.addProperty(property); 
+0

我試過了,但這並不是一個問題。問題在於[DataContract]和[DataMember]註釋未寫入服務代碼中。 (所以服務器無法反序列化我發送的內容)。解決這個問題時,代碼通過changind property.setName(「TwoIntegerWrapper」)將asmx服務用於property.setName(「obj」)。但問題仍然存在於wcf服務中。但是,這次它不接收空值,它總是接收(0,0)。 – iargin 2012-02-22 15:47:41

相關問題