传递给WCF服务(通过WCF测试客户端)的部分对象为null



我试图通过WCF测试客户端将一个复杂对象作为参数传递给WCF服务,但在服务端得到了null。该对象名为mailParameters,它包含一些字符串和名为"eMailAddress"的自定义对象(为了清晰起见,我简化了代码)。类用[DataContract]修饰,方法用[DataMember]修饰,并且在设置参数时,只有Subject和Body字符串被发送到WCF服务,而其他对象保持为null("eMailAddress")。

界面如下:

[ServiceContract]
public interface ISendMailService
{
    [OperationContract]
    void DeliverEmail(mailParameters mailParams);
}

[DataContract]
public class mailParameters
{
    [DataMember]
    public string Subject { get; set; }
    [DataMember]
    public string Body { get; set; }
    [DataMember]
    public eMailAddress Sender { get; set; }
    [DataMember]
    public eMailAddress MailFrom { get; set; }
}
[DataContract]
public class eMailAddress
{
    private string _Address;
    [DataMember]
    public string Address
    {
        get
        {
            return _Address;
        }
        set
        {
            _Address = Address;
        }
    }
    private string _Name;
    [DataMember]
    public string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            _Name = Name;
        }
    }
}

以及实现(没有实际的工作代码,而是通过调试来查看调用后是否所有的mailParam都通过了)。

public class SendMailService : ISendMailService
{
    public void DeliverEmail(mailParameters mailParams)
    {
        //throw new NotImplementedException();            
    }
}

当我检查传递给DeliverEmail方法的mailParams的值时,Subject和Body是正确的,但mailParams.MailFrom.Address和mailParams.MailFrom.Name都为null(mailParams.Sender也是如此…)

我还尝试过将eMailAddress类放入mailParameters类中,并得到相同的结果。

我找不到关于如何将复杂对象作为参数传递给WCF服务的简单示例(是的,我是WCF的专家),只有简单对象(工作正常)。不确定如何继续。有什么想法吗?

原因是您将[DataMember]-属性放错了位置。在mailParameters-类中,您使用自动属性,而在eMailAddress-类中不使用这些属性。

WCF要求用[DataMember]-属性修饰该字段或属性,该属性将实际包含信息。因此,在您的情况下,有两种选择:

  1. 使用自动特性而不是常规特性
  2. 或者:装饰田地而不是房产

选项1:

[DataContract]
public class eMailAddress
{
    [DataMember]
    public string Address { get; set; }
    [DataMember]
    public string Name { get; set; }
}

选项2:

[DataContract]
public class eMailAddress
{
    [DataMember]
    private string _Address;
    public string Address
    {
        get
        {
            return _Address;
        }
        set
        {
            _Address = Address;
        }
    }
    ...
}

最新更新