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

时间:2010-05-13 20:14:58

标签: c# wcf attributes

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

这可能吗?如果是,你可以提供任何关于如何实现这种行为的提示吗?

感谢。 丹尼斯。

2 个答案:

答案 0 :(得分:15)

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

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

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

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

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

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

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

使用此功能,您将在服务器和客户端上使用相同数据类型一个程序集 - 并且通过此“漏洞”,您可以保留这类.NET特性,如服务器和客户端之间的属性。

答案 1 :(得分:0)

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