2009-05-02 46 views
0

我是WCF的新手,目前我正在開發一個TCP WCF服務,我不確定我是否理解正確傳遞參數,因此我建議您進行評論並給出標準化的方式。在WCF中傳遞複雜類型的標準方式是什麼?

爲了弄清事情,我開發了一個小型服務,用於測試目的,它具有單一方法,並且依賴於暴露單個類的外部.Net dll。 服務合約代碼

[ServiceContract] 
    public interface IMyService 
    { 
     [OperationContract] 
     int Test1(actionType at, calculationType ct, action a); 
     [OperationContract] 
     int Test2(DataSeries s); 
    } 

actionTypecalculationTypeaction是在外部DLL 和DataSeries內部聲明枚舉是DLL內聲明的類。

dll中DataSeries類的原始定義僅在其成員上標記爲[Serializable]而沒有標記爲[DataMember]

我使用的客戶端和服務器端的3號的dll,我驚訝的是沒有把[DataContract]在DataSeries類,並沒有使用任何的[EnumMember]內部枚舉,[DataMember]類裏面做工精細兩個應用程序。

那麼是怎麼回事?

另一個實驗:

從客戶端刪除的第三方,並使用該服務,因爲它是 我發現VS2008生成枚舉和DataSeries類,並用正確的屬性,市場上贏得他們? 像

[System.CodeDom.Compiler.GeneratedCodeAttribute  ("System.Runtime.Serialization", "3.0.0.0")] 
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType", Namespace="http://schemas.datacontract.org/2004/07/DBInterface")] 
    public enum actionType : int { 

     [System.Runtime.Serialization.EnumMemberAttribute()] 
     All = 0, 

     [System.Runtime.Serialization.EnumMemberAttribute()] 
     Buy = 1, 

     [System.Runtime.Serialization.EnumMemberAttribute()] 
     Sell = 2, 
    } 

回答

1

DataContractDataMemberEnumMember屬性的服務合同由DataContractSerializer(通常basicHttpBindingwsHttpBinding)被使用。如果您使用TCP綁定公開端點(netTcpBinding),則只需要SerializableAttribute。請注意,使用DataContractSerializer,您只能將SerializableAttribute添加到您的類中,並且它會自動序列化所有字段。

我會向您推薦以下內容:如果您希望您的服務可以互操作,請使用basicHttpBinding並使用DataContract和DataMember屬性標記您的類。如果您的客戶端是.NET應用程序,請使用netTcpBinding並使用SerializableAttribute標記您的類。

您也可以閱讀這個post來比較不同的綁定。

+0

這是一個很好的答案,你能推薦鏈接/網站或書籍,給我詳細的信息關於WCF或MSDN是足夠的嗎? – 2009-05-02 13:20:28

0

所以對我來說我使用[DataContract] S,並通過在一個單一的參數,並返回一個數據契約回來。

這提供了更多的靈活性,因爲我可以將新的可選屬性的數據契約擴展到數據契約,而不會破壞任何現有的客戶端。

枚舉我也創建數據聯繫人;因爲我可以這樣做,在不破壞任何東西的情況下擴展枚舉,並且我可以控制名稱空間。

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")] 
public enum GenderEnum 
{ 
    [EnumMember()] 
    Unknown = 0, 
    [EnumMember()] 
    Male = 1, 
    [EnumMember()] 
    Female = 2 
} 

您必須然後標記與

[ServiceKnownType(typeof(GenderEnum))] 
public interface IServiceContract 
{ 
    .... 
} 
+0

但沒有使用DataContract或任何屬性更好,我發現客戶端方面正確工作 – 2009-05-02 13:04:50

1

但沒有使用DataContract或任何 屬性,我發現正確

是的,這是真的工作在客戶端 - 如果你使用的數據類型不符合[DataContract]標記, WCF將嘗試在其上使用默認的SOAP序列化器,並將所有公開的(所有公共屬性)序列化。

它的工作原理 - 但它可能不是你想要的/期望的 - 所以我會第二次darin的意見 - 總是在你的類型上使用明確的[DataContract]屬性。你對自己的意圖越清晰(或其他需要稍後維護代碼的程序員)越好。這些「魔術」幕後所發生往往有時造成混亂 - 你離依靠他們太多

馬克

相關問題