2009-05-02 1 views
0

Ich bin ein Neuling in WCF, derzeit entwickle ich einen TCP WCF-Dienst und ich bin mir nicht sicher, ob ich verstehe, Parameter richtig zu übergeben oder nicht, also empfehle ich Ihnen, einen Kommentar zu geben und einen standardisierten Weg zu geben.Was ist der standardisierte Weg, um komplexe Typen in WCF zu übergeben?

Um die Dinge klar zu machen, habe ich einen kleinen Dienst für Testzwecke entwickelt, der eine einzige Methode hat und von einer externen .Net-DLL abhängt, die einzelne Klassen freilegt. Der Servicevertrag Code

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

Wo actionType, calculationType, action sind Aufzählungen in der die externen DLL erklären und DataSeries ist eine Klasse, in der DLL erklärt.

Die origianl defination für die DataSeries Klasse in der dll von [Serializable] nur markiert und ohne [DataMember] auf ihre Mitglieder.

ich die 3. dll auf dem Client und Server-Seite verwende, war meine Überraschung, beide Anwendungen arbeiten gut ohne [DataContract] auf der Datenreihe Klasse zu setzen und ohne von [EnumMember] innen Aufzählungen zu verwenden, [DataMember] innerhalb der Klasse.

Also, was ist los?

Ein weiteres Experiment:

die dritte Partei von der Clientseite aus- und mit dem Service, wie es ist, fand ich, dass die VS2008 die Aufzählungen und die DataSeries Klasse erzeugt und markes sie mit den richtigen Eigenschaften? wie

[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, 
    } 

Antwort

1

DataContract, DataMember und EnumMember Attribute verwendet werden durch die DataContractSerializer (in der Regel basicHttpBinding oder wsHttpBinding). Wenn Sie einen Endpunkt mit TCP-Bindung aussetzen (netTcpBinding), ist nur SerializableAttribute erforderlich. Beachten Sie, dass Sie mit DataContractSerializer nur SerializableAttribute zu Ihren Klassen hinzufügen können und alle Felder automatisch serialisiert werden.

Ich würde Ihnen Folgendes empfehlen: Wenn Ihr Dienst interoperabel sein soll, verwenden Sie basicHttpBinding und markieren Sie Ihre Klassen mit DataContract- und DataMember-Attributen. Wenn Ihr Client eine .NET-Anwendung ist, verwenden Sie netTcpBinding und markieren Sie Ihre Klassen mit SerializableAttribute.

Sie können diese post auch zum Vergleich zwischen verschiedenen Bindungen lesen.

+0

Dies ist eine gute Antwort, können Sie Link/Website oder Buch empfehlen, die mir Informationen in Details über WCF oder MSDN ist ausreichend? –

0

für mich Also ich benutze [Datacontract] s, und einen einzelnen Parameter in, übergeben und einen Datenvertrag zurück zurück.

Dies gibt mehr Flexibilität, da ich den Datenvertrag mit neuen, optionalen Attributen auf den Datenvertrag erweitern kann, ohne bestehende Clients zu brechen.

Enums Ich erstelle auch Daten-Kontakte für; weil ich dann dasselbe machen kann, die enum erweitern, ohne etwas zu brechen, und ich kann den Namensraum kontrollieren.

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

Sie müssen dann markieren Sie den Servicevertrag mit

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

Aber ohne die Verwendung von Datacontract oder alle Attribute, fand ich den Client Seite funktioniert einwandfrei –

1

Aber ohne Datacontract oder irgendwelche Attribute zu verwenden, fand ich die Client-Seite richtig

Ja arbeiten, das ist wahr - wenn die Datentypen verwenden, werden nicht mit dem [Datacontract] markiert, WCF wird versuchen, den standardmäßigen SOAP-Serializer für sie zu verwenden und einfach alles zu serialisieren, das öffentlich ist (alle öffentlichen Eigenschaften).

Es funktioniert - aber es könnte nicht sein, was Sie wollen/erwarten - also würde ich die Meinung von darin - nur immer explizite [DataContract] Attribute auf Ihren Typen verwenden. Je klarer Sie Ihre Absicht für sich selbst (oder andere Programmierer, die Ihren Code später pflegen müssen), desto besser. Diese „Zaubertricks“, die hinter den Kulissen passieren neigen Verwirrung manchmal zu verursachen - du bist besser dran nicht unter Berufung auf sie zu viel

Marc

Verwandte Themen