2014-04-30 33 views
0

我正在寫一個WCF服務,將由專有的WebService(asmx)調用。我只能訪問一個非常簡短的文檔和用於驗證WCF服務功能的測試工具。測試工具失敗:對象引用未設置爲對象的實例。WebService客戶端錯誤調用WCF與類作爲輸入參數

有一個方法,爲getBalance,供應一類作爲輸入參數WCF:

class ClientRequest 
{ 
int ClientID, 
string Currency, 
datetime AsOfDate 
} 

,並希望返回:

class ClientResponse 
{ 
int ClientID, 
decimal Balance 
} 

這就是我對文檔的查看。
簡單數據類型的其他方法工作得很好。
經過一番研究,我的問題範圍縮小到簡單和複雜的輸入數據類型之間的SOAP XML的區別:
簡單(片段):

<soap:Envelope xmlns:soap="h t t p ://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="h t t p :// www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h t t p ://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
    <GetUserDetails xmlns="h t t p ://t e m p u r i . o r g/"> 
     <UserID>12345</UserID> 

... ..

複合物(摘錄) :

<soap:Envelope xmlns:soap="h t t p ://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="h t t p : //www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h t t p ://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
    <GetBalance xmlns="h t t p ://tempuri.org/"> 
     **<request>** 
      <ClientID>645</ClientID> 

......

在我的WCF代碼:

[ServiceContract (Namespace="h t t p : //tempuri.org/")]  
public interface IClientAPI 
{ 
[OperationContract(Action = " h t t p : //tempuri.org/GetBalance", ReplyAction = "h t t p ://tempuri.org/GetBalance")] 
ClientResponse GetBalance(ClientRequest clientrequest); 
} 

[DataContract(Namespace = "h t t p ://tempuri.org/"), Serializable] 
public class ClientRequest 
{ 
[DataMember] 
public int ClientID { get; set; } 
[DataMember] 
public string Currency { get; set; } 
[DataMember] 
public datetime AsOfDate { get; set; } 
} 

............... ..

[DataContract(Namespace = "http://t e m p u r i . o r g/")] 
public class ClientResponse 
{ 
[DataMember] 
public int ClientID { get; set; } 
[DataMember] 
public decimal Balance { get; set; } 

public static ClientResponse GetBalance(ClientRequest clientrequest) 
{ 
    //DO STUFF 
    return response; 
    } 
} 

服務:

public ClientResponse GetBalance(ClientRequest clientrequest) 
     { 
      ClientResponse r = new ClientResponse(); 
      int i = ClientResponse.GetBalance(clientrequest); 
      //DO STUFF 
     return r; 
    } 

輸入的ClientRequest這裏始終是NULL。
顯然它與SOAP輸入中的標記有關。
任何進一步的線索,想法,文章將非常讚賞。 GetBalance方法中的錯誤是:未將對象引用設置爲對象的實例。 ClientRequest爲空。
非常感謝。
埃德

回答

0

後幾天我發現溶液(文檔有點關閉):
的參數名必須隨後的方法名的SOAP的XML標籤匹配(如在複合體(片段所示):同上) 。在這種情況下,而不是調用/使用:

{ 
    ClientResponse GetBalance(ClientRequest clientrequest); 
} 

它應該是:

{ 
    ClientResponse GetBalance(ClientRequest request); 
} 
+0

另外我需要添加[數據成員(訂單= 2)],以匹配在SOAP元素的順序。 – KSNSACC