我正在编写一个将由专有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为空。
非常感谢。
编
答案 0 :(得分:0)
几天后我找到了解决方案(文档有点偏离):
参数名称必须与方法名称后面的SOAP XML标记匹配(如上面的Complex(代码段)中所示)。在这种情况下,而不是调用/使用:
{
ClientResponse GetBalance(ClientRequest clientrequest);
}
它应该是:
{
ClientResponse GetBalance(ClientRequest request);
}