WebService客户端错误以类作为输入参数调用WCF

时间:2014-04-30 13:59:31

标签: c# web-services wcf soap

我正在编写一个将由专有WebService(asmx)调用的WCF服务。我只能访问非常简短的文档和用于验证WCF服务功能的测试工具。测试工具失败:对象引用未设置为对象的实例。

有一种方法GetBalance,它将一个类作为输入参数提供给WCF:

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

并期待回归:

class ClientResponse
{
int ClientID,
decimal Balance
}  

这就是我在doc中的所有内容 其他简单数据类型的方法也可以正常工作 经过一些研究后,我将问题缩小到简单和复杂输入数据类型之间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为空。
非常感谢。

1 个答案:

答案 0 :(得分:0)

几天后我找到了解决方案(文档有点偏离):
参数名称必须与方法名称后面的SOAP XML标记匹配(如上面的Complex(代码段)中所示)。在这种情况下,而不是调用/使用:

{  
    ClientResponse GetBalance(ClientRequest clientrequest);  
}  

它应该是:

{  
    ClientResponse GetBalance(ClientRequest request);  
}