通过wcf服务发送带有自定义属性的对象

我刚开始学习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类型的属性时,我找不到任何。

这可能吗? 如果是,您可以提供有关如何实现此类行为的任何提示吗?

谢谢。 丹尼斯。

WCF是一种基于消息的服务 – 您在一侧序列化您的消息,将其发送到另一侧并在另一侧接收它。 您不是在发送对象时发送对象 – 您只发送序列化消息。 这是一个非常重要的区别!

您的服务器和客户端是完全独立的 – 它们不共享除服务描述(服务方法列表)之外的任何内容,以及XML模式forms的数据协定。

创建客户端时获得的是服务方法的代理,以及序列化格式具有相同签名的数据协定副本 (通常看起来相同但名称不同)。 这就是全部。 您将在客户端获得一个新的独立类,它将序列化为与服务器端原始类相同的格式。

这意味着:您将获得相同的字段和属性 – 但就是这样。 复制任何其他内容(如实现的接口,.NET属性等)。 它们不可能 – 毕竟,WCF是可互操作的 – 客户端可以是PHP应用程序或Ruby程序。 他们如何处理.NET自定义属性?

简而言之:任何特定于.NET且超出简单的基于XML模式的数据表示的内容都不能在WCF服务中使用。

有一个循环漏洞 – 如果您控制通信的两端 – 服务器和客户端 – 并且都是.NET,那么您可以:

  • 将所有服务和数据合同放入单独的共享程序集中
  • 在服务器端引用服务实现中的程序集
  • 引用客户端代理中的程序集

使用它,您将在服务器端和客户端上都有一个具有相同数据类型的程序集 – 并且通过这个“漏洞”,您可以保留诸如服务器和客户端之间的属性之类的.NET细节。

我今天遇到了同样的问题(6年后,我知道)。 无论如何,我遇到的是一个问题,我将ExtensionData属性发送到服务器端的存储过程,我不想发送。 所以我的问题完全在服务器端。 我需要做的就是在我的wcf服务上声明属性,当我创建参数时,只需获取用正确属性修饰的属性,这样我就不会将该属性与其他属性/参数一起发送。