Frage

Ich bin ein Neuling in WCF, zur Zeit ich einen TCP WCF-Dienst entwickle und ich bin nicht sicher, dass ich Parameter verstehen vorbei richtig ist oder nicht, so empfehle ich Ihnen, eine standardisierte Art und Weise zu äußern und geben.

Um die Dinge klar bekomme ich einen kleinen Dienst entwickelt Zweck den Zweck zu testen, die einzige Methode hat und hängt von einer externen .NET-DLL, die einzelne Klasse verfügbar macht. 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 Aufzählungen sind innerhalb der der externen dll erklärt und DataSeries ist eine Klasse innerhalb der DLL erklärt.

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

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

Also, was ist hier los?

Ein weiteres Experiment:

Das Entfernen der dritten Partei von der Client-Seite und die Nutzung des Dienstes, wie es ist Ich fand, dass das 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,
    }
War es hilfreich?

Lösung

Datacontract, Datamember und EnumMember Attribute der DataContractSerializer (in der Regel oder Basichttpbinding wsHttpBinding ). Wenn Sie einen Endpunkt mit TCP-Bindung aussetzen ( netTcpBinding ) nur SerializableAttribute erforderlich. Beachten Sie, dass mit DataContractSerializer Sie nur SerializableAttribute zu Ihren Klassen hinzufügen könnte und es wird automatisch alle Felder serialisiert werden.

Ich würde Ihnen empfehlen Sie folgendes: Wenn Sie Ihren Dienst interoperabel sein möchten, verwenden Sie Basichttpbinding und markieren Sie Ihre Klassen mit Datacontract und Datamember Attribute. Wenn Ihr Kunde eine .NET-Anwendung ist, verwenden Sie netTcpBinding und Ihre Klassen mit SerializableAttribute markieren.

Sie könnten auch diese Post zum Vergleich zwischen verschiedene Bindungen.

Andere Tipps

  

Aber ohne die Verwendung von Datacontract oder jedem   Attribute, I die Client-Seite gefunden   richtig funktioniert

Ja, das stimmt - wenn die Datentypen verwendet, werden nicht mit dem [Datacontract] markiert, wird WCF versuchen, den Standard-SOAP-Serializer auf, sich zu nutzen und einfach alles serialisiert, die Öffentlichkeit (alle öffentlichen Eigenschaften)

Es funktioniert - aber es könnte nicht sein, was Sie wollen / erwarten - so würde ich nach Ansicht der zweiten Darin - nur immer explizit mit [Datacontract] Attribute auf Typen. Je klarer Sie machen Ihre Absicht, sich selbst (oder andere Programmierer, die müssen Sie Ihren Code später halten), desto besser. Diese „Zaubertricks“, die hinter den Kulissen passieren neigen Verwirrung manchmal zu verursachen - du bist besser dran nicht auf sie verlassen zu viel

Marc

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

Das gibt mehr Flexibilität, da ich den Datenvertrag mit neuen, optionalen Attributen an den Datenvertrag verlängern kann, ohne dass bestehende Kunden zu brechen.

Aufzählungen ich auch Daten Ansprechpartner für erstellen; weil ich die gleichen dann tun kann, die Enum zu verlängern, ohne etwas zu zerbrechen, und ich kann den Namensraum steuern.

[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
{
    ....
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top