簡體   English   中英

通過wcf服務發送帶有自定義屬性的對象

[英]Send objects with custom attributes via a wcf service

我剛剛開始學習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模式形式的數據協定。

創建客戶端時獲得的是服務方法的代理,以及序列化格式具有相同簽名的數據協定副本 (通常看起來相同但名稱不同)。 這就是全部。 您將在客戶端獲得一個新的獨立類,它將序列化為與服務器端原始類相同的格式。

這意味着:您將獲得相同的字段和屬性 - 但就是這樣。 不會復制任何其他內容(如實現的接口,.NET屬性等)。 它們不可能 - 畢竟,WCF是可互操作的 - 客戶端可以是PHP應用程序或Ruby程序。 他們如何處理.NET自定義屬性?

簡而言之:任何特定於.NET且超出簡單的基於XML模式的數據表示的內容都不能在WCF服務中使用。

有一個循環漏洞 - 如果您控制通信的兩端 - 服務器和客戶端 - 並且都是.NET,那么您可以:

  • 將所有服務和數據合同放入單獨的共享程序集中
  • 在服務器端引用服務實現中的程序集
  • 引用客戶端代理中的程序集

使用它,您將在服務器和客戶端都有一個具有相同數據類型的程序集 - 並且通過這個“漏洞”,您可以保留諸如服務器和客戶端之間的屬性之類的.NET細節。

我今天遇到了同樣的問題(6年后,我知道)。 無論如何,我遇到的是一個問題,我將ExtensionData屬性發送到服務器端的存儲過程,我不想發送。 所以我的問題完全在服務器端。 我需要做的就是在我的wcf服務上聲明屬性,當我創建參數時,只需獲取用正確屬性修飾的屬性,這樣我就不會將該屬性與其他屬性/參數一起發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM