我刚刚开始学习WCF因为我需要它来完成学校作业。但是当我尝试发送带有一些自定义属性的对象时,我遇到了问题。 对象是:
[DataContract]
public class Person
{
[DataMember]
[Searchable("ID")]
public virtual String ID
{
get;
set;
}
[DataMember]
[Searchable("LastName")]
public virtual String LastName
{
get;
set;
}
[DataMember]
[Searchable("FirstName")]
public virtual String FirstName
{
get;
set;
}
}
自定义属性为:
[DataContract]
[AttributeUsage(AttributeTargets.Property)]
public class Searchable:Attribute
{
public Searchable(String PropertyName)
{
this.PropertyName = PropertyName;
}
[DataMember]
public virtual String PropertyName
{
get;
set;
}
}
我使用svcutil生成配置文件和客户端。客户端和服务之间的通信正在顺利进行。但是当我收到 Person 类型的对象并尝试搜索 Searchable 类型的属性时,我找不到任何。
这可能吗?如果是,你可以提供任何关于如何实现这种行为的提示吗?
感谢。 丹尼斯。
答案 0 :(得分:15)
WCF是一种基于消息的服务 - 您在一侧序列化您的消息,将其发送到另一侧,然后在另一侧接收消息。您放置它时不是发送对象 - 您只发送序列化消息。这是一个非常重要的区别!
您的服务器和客户端是完全独立的 - 它们不会共享除服务描述(服务方法列表)之外的任何内容,也不会以XML模式的形式共享数据。
创建客户端时获得的是服务方法的代理,以及具有相同副本(看起来相同,但通常是不同的命名空间) >序列化格式的签名。这就是全部。您将在客户端获得一个新的独立类,它将序列化为与服务器端原始类相同的格式。
这意味着:您将获得相同的字段和属性 - 但就是这样。其他任何东西(如实现的接口,.NET属性等)都不复制。它们不可能 - 毕竟,WCF是可互操作的 - 客户端可以是PHP应用程序或Ruby程序。他们如何处理.NET自定义属性?
简而言之:任何特定于.NET且超出简单的基于XML模式的数据表示的内容都不能在WCF服务中使用。
有一个循环漏洞 - 如果您控制通信的两端 - 服务器和客户端 - 并且都是.NET,那么您可以:
使用此功能,您将在服务器和客户端上使用相同数据类型一个程序集 - 并且通过此“漏洞”,您可以保留这类.NET特性,如服务器和客户端之间的属性。
答案 1 :(得分:0)
我今天遇到了同样的问题(6年后,我知道)。无论如何,我遇到的是一个问题,我将ExtensionData属性发送到服务器端的存储过程,我不想发送。所以我的问题完全在服务器端。我需要做的就是在我的wcf服务上声明属性,当我创建参数时,只需获取用正确属性修饰的属性,这样我就不会将该属性与其他属性/参数一起发送。