50 votes

Partage d'énumération avec le service WCF

J'ai quelques applications parmi lesquelles je voudrais partager un C# enum. Je n'arrive pas à comprendre comment partager une déclaration d'enum entre une application régulière et un service WCF.

Voici la situation. J'ai 2 léger C# destop applications et une WCF service web qui ont besoin de partager les valeurs de l'enum.

Client 1 a

 Method1( MyEnum e, string sUserId );

Client 2 a

Method2( MyEnum e, string sUserId );

Webservice a

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);

Mon premier était bien de créer une bibliothèque appelée Common.dll pour encapsuler l'enum et puis il suffit de référence de la bibliothèque dans tous les projets où l'enum est nécessaire. Cependant, WCF rend les choses difficiles parce que vous avez besoin de marquer les enum pour être une partie intégrante du service. Comme ceci:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

Donc .... Est-il un moyen de partager un enum parmi un service WCF et d'autres applictions?

46voto

Szymon Rozga Points 11277

À l'aide de la bibliothèque Commune doit être fine. Les énumérations sont sérialisables et la DataContract attributs ne sont pas nécessaires.

Voir: http://msdn.microsoft.com/en-us/library/ms731923.aspx

L'énumération des types. Les énumérations, y compris le drapeau énumérations, sont serializable. En option, l'énumération des types peut être marqué avec le DataContractAttribute attribut, dans ce cas, tous les membres qui participe à la sérialisation doivent être marqués avec l' EnumMemberAttribute attribut

EDIT: de Même, il devrait y avoir aucun problème avec le fait d'avoir l'enum marqué comme un DataContract et d'avoir des bibliothèques clientes de l'utiliser.

35voto

Keith G Points 1839

Je dois avoir eu quelques problèmes avec une référence de service obsolète ou quelque chose. Je suis retourné et j'ai créé une bibliothèque commune contenant l'énum, et tout fonctionne bien. J'ai simplement ajouté une référence à l'aide au fichier de l'interface de service.

 using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}
 

et j'ai laissé tomber ce qui suit:

 [DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };
 

Je suppose que puisque l'énumération est référencée via ServiceKnownType, elle n'a pas besoin d'être marquée dans la bibliothèque externe avec [DataContract] ou [Enumerator]

34voto

Pilsator Points 273

J'avais un problème bizarre et pensé qu'il pourrait être intéressant pour vous. J'ai aussi eu des problèmes que j'ai eu une connexion arrêter quand j'ai utilisé les énumérations dans mon contrat de données. Il m'a fallu un certain temps pour trouver ce que le vrai problème était le suivant: j'ai utilisé les énumérations, de l'int les valeurs attribuées. Ils ont commencé par 1 au lieu de 0. Évidemment, WCF nécessite qu'un enum valeur égale à 0 pour la sérialisation. Si vous n'avez pas état de toutes les valeurs dans votre énumération, d'un système automatique int valeur de la cartographie sera fait pour vous en commençant par 0, donc tout va bien. Mais lorsque vous les copiez coller d'autres enum définition où la valeur 0 n'est pas affecté, vous n'obtiendrez pas ce que votre client par le biais de la WCF - incroyable, mais vrai!

0voto

vous pouvez assigner des valeurs int à vos membres Enum et simplement utiliser les int pour le transfert et les relancer si nécessaire dans votre type Enum

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X