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

时间:2016-05-16 15:52:06

标签: c# .net web-services wcf datacontract

我试图通过WCF测试客户端将复杂对象作为参数传递给WCF服务,但是在服务端获取空值。 该对象称为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;
        }
    }

}

实现(没有实际的工作代码,但是通过调试来看看调用后是否所有的mailParams都通过了。)

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的菜鸟),只有简单的对象(工作正常)。不知道如何继续。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

原因是,您已将[DataMember] - 属性放在错误的位置。在您的mailParameters - 课程中,您使用的是自动属性,而您未在eMailAddress课程中使用这些内容。

WCF要求使用[DataMember] - 属性修饰的字段或属性,该属性将实际保存信息。所以在你的情况下,有两个选择:

  1. 使用自动属性而不是常用属性
  2. 或:装饰字段而不是属性
  3. 选项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;
            }
        }
    
        ...
    }