Question

Je suis un débutant dans la WCF, je suis en train de développer un service TCP WCF et je ne suis pas sûr de bien comprendre comment passer des paramètres correctement. Je vous recommande donc de commenter et de donner une méthode normalisée.

Pour clarifier les choses, j’ai développé un petit service de test utilisant une méthode unique et reposant sur une dll externe .Net exposant une seule classe. Le code du contrat de service

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

type d'action , type de calcul , action sont des énumérations déclarées dans la dll externe et DataSeries est une classe déclarée à l'intérieur de la dll.

La définition de l'origine de la classe DataSeries dans la DLL est marquée par [Serializable] uniquement et pas de [DataMember] sur ses membres.

J'utilise la troisième DLL du côté client et côté serveur. À ma grande surprise, les deux applications fonctionnaient correctement sans mettre [DataContract] sur la classe DataSeries et sans utiliser [EnumMember]. dans les énumérations, [DataMember] dans la classe.

Alors, que se passe-t-il?

Une autre expérience:

Suppression du tiers du côté client et utilisation du service en tant que tel J'ai trouvé que le vs2008 génère les enums et la classe DataSeries et les marque avec les attributs appropriés? comme

    [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,
    }
Était-ce utile?

La solution

DataContract , DataMember et EnumMember sont les attributs utilisés par DataContractSerializer (généralement basicHttpBinding ou wsHttpBinding ). Si vous exposez un ordinateur d'extrémité avec une liaison TCP ( netTcpBinding ) Uniquement SerializableAttribute est requis. Notez qu'avec DataContractSerializer, vous ne pouvez ajouter que SerializableAttribute à vos classes et il sérialisera automatiquement tous les champs.

Je vous recommanderais ce qui suit: si vous souhaitez que votre service soit interopérable, utilisez basicHttpBinding et marquez vos classes avec les attributs DataContract et DataMember. Si votre client est une application .NET, utilisez netTcpBinding et marquez vos classes avec SerializableAttribute.

Vous pouvez également lire cet poster pour une comparaison entre différentes liaisons.

Autres conseils

  

Mais sans utiliser DataContract ni aucun   attributs, j'ai trouvé le côté client   fonctionne correctement

Oui, c'est vrai - si les types de données que vous utilisez ne sont pas marqués avec [DataContract], WCF essaiera d'utiliser le sérialiseur SOAP par défaut sur eux et ne fera que sérialiser tout ce qui est public (toutes les propriétés publiques).

Cela fonctionne - mais ce n'est peut-être pas ce que vous voulez / attendez - donc l'opinion de darin en second lieu - utilisez toujours les attributs explicites [DataContract] sur vos types. Plus votre intention est claire pour vous (ou pour les autres programmeurs qui doivent gérer votre code ultérieurement), mieux c'est. Ces "tours de magie" ce qui se passe dans les coulisses a parfois tendance à semer la confusion - mieux vaut ne pas compter trop sur eux

Marc

Donc, pour moi, j'utilise [DataContract] s, passe un seul paramètre et renvoie un contrat de données.

Cela donne plus de flexibilité, car je peux étendre le contrat de données avec de nouveaux attributs facultatifs, sans casser aucun client existant.

Enums J'ai également créé des contacts de données pour; parce que je peux alors faire la même chose, étendre l’enum sans rien casser, et contrôler l’espace de nommage.

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

Vous devez ensuite marquer le contrat de service avec

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top