簡體   English   中英

WCF:MessageContract、DataContract ... 感到困惑?

[英]WCF: MessageContract, DataContract … Confused?

我正在編寫我的第一個 WCF 服務。 我決定先將服務編寫為 DLL,然后再將 WCF 的內容放在我現在所在的位置。

架構師建議我應該堅持我已經完成的消息對象的特定格式。 但是,我在消息對象中使用了接口、復雜類型及其列表。 我要添加屬性,我有點困惑。

這是我的代碼的展示示例。

[ServiceContract]
public interface MyServiceContract
{
     [OperationContract]
     MyMethodResponseMessage MyMethod(MyMethodRequestMessage request);
}

public class MyService : MyServiceContract
{
    public MyMethodResponseMessage MyMethod(MyMethodRequestMessage request)
    {
        //Do things
    }
}

//Messages
[MessageContract]
public class MyMethodResponseMessage 
{
    [MessageBodyMember]
    public MyMethodResponse Body { get; set; }
}

[DataContract]
public class MyMethodResponse
{
    [DataMember]
    public IMyComplexTypeItem { get; set; }

    [DataMember]
    public List<IMyComplexType> Items { get; set; }

    [DataMember]
    public bool Success { get; set; }
}

//DTO    
public interface IMyComplexType 
{
    [DataMember]
    string Identity { get; set; }
}

[DataContract]
public class MyComplexType1 : IMyComplexType
{
     [DataMember]
     public virtual string Identity
}

任何人都可以評論使用 MessageContract、DataContract、DataMember 和 Serializable 等的正確性嗎? 有任何指示或明顯的錯誤嗎?

還有哪個序列化器最好用? 以及確保我從中獲得良好的 XML 以便其他客戶可以輕松使用我的服務的最佳策略是什么?

重新請求/響應 - [DataContract]也可以。 消息合同的優點之一是您可以對成員設置隱私,但在許多情況下這不是必需的。 在這種情況下,我更喜歡讓合同盡可能簡單,就像數據合同一樣。

Re which serializer - 這在很大程度上是配置的一個因素。 默認情況下超過 http,例如,它將是DataContractSerializer

但是,我不確定IMyComplexType列表是否會很好地工作。 您可以嘗試,但通常它需要具體類型。 請注意,對於基類,您可以使用[KnownType]來指定允許的子類型。

請注意,與XmlSerializer不同,集合成員不需要設置器 - 盡管如果這樣做,您可能需要添加OnDeserializing回調方法來初始化列表(WCF 不調用構造函數)。

另外:您還可以將protobuf-net與數據合同和 WCF 一起使用(只要它們有明確的訂單); 這比常規的 xml 更密集。 不過,它目前不支持消息合同。

雖然不是您問題的直接答案,但值得注意MSDN 中的以下內容 - 使用消息合同

每個單獨的消息 header 和消息正文部分使用為使用消息的服務合同選擇的序列化引擎進行序列化(轉換為 XML)。 默認序列化引擎XmlFormatter可以處理任何具有數據協定的類型,無論是顯式(通過具有 System.Runtime.Serialization.DataContractAttribute)還是隱式(通過作為原始類型,具有 System.SerializableAttribute 等) )。

在此處輸入圖像描述

暫無
暫無

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

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