传递给 WCF 服务(通过 WCF 测试客户端)的部分对象为空
parts of objects passed to WCF service (via WCF test client) are null
我试图通过 WCF 测试客户端将一个复杂对象作为参数传递给 WCF 服务,但在服务端得到了空值。
该对象称为 mailParameters,它包含一些字符串和名为 "eMailAddress" 的自定义对象(为清楚起见,我简化了代码)。
classes 用 [DataContract] 修饰,方法用 [DataMember] 修饰,当设置参数时,只有 Subject 和 Body 字符串被发送到 WCF 服务,而其他对象保持为空("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 都是空的(mailParams.Sender...)
我也试过将 eMailAddress class 放入 mailParameters class 并得到相同的结果。
我找不到关于如何将复杂对象作为参数传递给 WCF 服务的简单示例(是的,我是 WCF 的菜鸟),只能找到简单的对象(效果很好)。不确定如何进行。有什么想法吗?
这是因为您将 [DataMember]
属性放在了错误的位置。在您的 mailParameters
-class 中,您使用的是 自动属性 ,而您在 eMailAddress
-class 中没有使用这些.
WCF 要求该字段或 属性 用 [DataMember]
属性修饰,该属性实际上将保存信息。所以在你的情况下,有两种选择:
- 使用自动属性而不是通常的属性
- 或者:装饰字段而不是属性
选项 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;
}
}
...
}
我试图通过 WCF 测试客户端将一个复杂对象作为参数传递给 WCF 服务,但在服务端得到了空值。 该对象称为 mailParameters,它包含一些字符串和名为 "eMailAddress" 的自定义对象(为清楚起见,我简化了代码)。 classes 用 [DataContract] 修饰,方法用 [DataMember] 修饰,当设置参数时,只有 Subject 和 Body 字符串被发送到 WCF 服务,而其他对象保持为空("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 都是空的(mailParams.Sender...)
我也试过将 eMailAddress class 放入 mailParameters class 并得到相同的结果。
我找不到关于如何将复杂对象作为参数传递给 WCF 服务的简单示例(是的,我是 WCF 的菜鸟),只能找到简单的对象(效果很好)。不确定如何进行。有什么想法吗?
这是因为您将 [DataMember]
属性放在了错误的位置。在您的 mailParameters
-class 中,您使用的是 自动属性 ,而您在 eMailAddress
-class 中没有使用这些.
WCF 要求该字段或 属性 用 [DataMember]
属性修饰,该属性实际上将保存信息。所以在你的情况下,有两种选择:
- 使用自动属性而不是通常的属性
- 或者:装饰字段而不是属性
选项 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;
}
}
...
}