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

Den*_*sca 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义属性是:

[DataContract]
[AttributeUsage(AttributeTargets.Property)]
public class Searchable:Attribute
{
    public Searchable(String PropertyName)
    {
        this.PropertyName = PropertyName;
    }

    [DataMember]
    public virtual String PropertyName
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用svcutil生成配置文件和客户端.客户端和服务之间的通信正在顺利进行.但是当我收到Person类型的对象并尝试搜索Searchable类型的属性时,我找不到任何.

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

谢谢.丹尼斯.

mar*_*c_s 15

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

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

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

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

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

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

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

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