c# wcf enums

c# - Compartiendo Enum con el Servicio WCF



enums (4)

Debo haber tenido algunos problemas con una referencia de servicio obsoleta o algo así. Volví y creé una biblioteca común que contiene la enumeración, y todo funciona bien. Simplemente agregué una referencia de uso al archivo de la interfaz de servicio.

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

y dejé lo siguiente:

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

Supongo que como la referencia se hace a través de ServiceKnownType, no fue necesario marcarla en la biblioteca externa con [DataContract] o [Enumerator]

Tengo pocas aplicaciones diferentes entre las que me gustaría compartir un enum de C #. No puedo entender cómo compartir una declaración enum entre una aplicación normal y un servicio WCF.

Aquí está la situación. Tengo 2 aplicaciones ligeras Ctop destop y un servicio web WCF que todos necesitan compartir valores enum.

El cliente 1 tiene

Method1( MyEnum e, string sUserId );

El cliente 2 tiene

Method2( MyEnum e, string sUserId );

El servicio web tiene

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

Sin embargo, mi inicial era crear una biblioteca llamada Common.dll para encapsular la enumeración y luego simplemente hacer referencia a esa biblioteca en todos los proyectos donde se necesita la enumeración. Sin embargo, WCF hace las cosas difíciles porque necesita marcar la enumeración para que sea una parte integral del servicio. Me gusta esto:

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

Entonces ... ¿Hay alguna forma de compartir una enumeración entre un servicio de WCF y otras aplicaciones?


Tuve un problema bastante extraño y pensé que podría ser interesante para ti. También tuve problemas que obtuve una parada de conexión cuando utilicé enumeraciones en mi contrato de datos. Me llevó bastante tiempo descubrir cuál era el verdadero problema: utilicé enumeraciones con valores int asignados. Empezaron por 1 en lugar de 0. Obviamente, WCF requiere que haya un valor enum igual a 0 para la serialización. Si no especifica ningún valor dentro de su enumeración, se realizará una asignación de valor int automática para usted empezando por 0, de modo que todo está bien. Pero cuando copie y pegue alguna otra definición de enum donde no se asigna el valor 0, no lo obtendrá a través de WCF, ¡extraño pero cierto!


Usar la biblioteca común debería estar bien. Las enumeraciones son serializables y los atributos de DataContract no son necesarios.

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

Tipos de enumeración. Las enumeraciones, incluidas las enumeraciones de banderas, son serializables. Opcionalmente, los tipos de enumeración se pueden marcar con el atributo DataContractAttribute, en cuyo caso cada miembro que participa en la serialización debe marcarse con el atributo EnumMemberAttribute.

EDITAR: Aún así, no debería haber ningún problema con tener la enumeración marcada como un DataContract y tener bibliotecas cliente usándola.


puedes asignar valores int a tus miembros de Enum y solo usar int para la transferencia y cuando sea necesario devolverlos a tu tipo de Enum