我刚刚开始学习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细节.