2008-10-09 27 views
47

Tengo pocas aplicaciones diferentes entre las que me gustaría compartir una Cum enum. No puedo entender cómo compartir una declaración enum entre una aplicación normal y un servicio WCF.Compartiendo Enum con WCF Service

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

cliente 1 tiene

Method1(MyEnum e, string sUserId); 

cliente 2 tiene

Method2(MyEnum e, string sUserId); 

servicio web tiene

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

Mi inicial, aunque era crear una biblioteca llamada Common.dll para encapsular la enumeración y luego solo haga 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. De esta manera:

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

Así que .... ¿Hay una manera de compartir una enumeración entre un servicio WCF y otros applictions?

+0

Se recomienda evitar las enumeraciones en los servicios web porque crean sutiles problemas compatibles con versiones anteriores. Ver http://stackoverflow.com/a/788281/52277 –

+1

No se aplica en este caso; los problemas de compatibilidad con versiones anteriores a los que se hace referencia se deben a * devolver * una enumeración a un cliente (lo que claramente puede romperlos) versus tomar una enumeración como entrada. –

Respuesta

45

El uso de 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 indicadores, son serializables. Opcionalmente, tipos de enumeración se pueden marcar con el atributo DataContractAttribute, en cuyo caso todos los miembros que participa en la serialización deben estar marcados con el EnumMemberAttribute atributo

EDIT: Aún así, no debería haber ningún problema con tener la enum marcado como DataContract y teniendo bibliotecas cliente usándolo.

+4

Se recomienda evitar las enumeraciones en los servicios web porque crean sutiles problemas compatibles con versiones anteriores. Ver http://stackoverflow.com/a/788281/52277 –

0

podría asignar valores int a los miembros de su ENUM y sólo tiene que utilizar para la transferencia de int y cuando sea necesario fundir de nuevo en su tipo Enum

+4

Derrota el propósito de enum. – Gaui

33

Debo haber tenido algunos problemas con una referencia de servicio obsoleto 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 se me cayó el siguiente:

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

supongo que ya se hace referencia a la enumeración a través de ServiceKnownType, no necesitan ser marcados en la biblioteca externa con [DataContract] o [enumerador ]

+0

Funcionó bien para mí. ¡Gracias! – Contango

+0

Funcionó muy bien para mí también. ¡Gracias! – ari

32

Tuve un problema bastante extraño y pensé que podría ser interesante para usted. 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!

+8

Ojalá pudiera votar su respuesta mil millones de veces. Solo me paso dos horas desenrollando un contrato de datos para ver qué propiedad estaba causando el problema. Ya sé que el equipo de WCF a veces los Enumeces se asignan a las tablas de búsqueda en la base de datos donde generalmente la primera entrada es una y no cero. – MotoWilliams

+0

MotoWilliams básicamente ha dicho exactamente lo que quería decir. Encontré esta respuesta después de intentar resolver este problema por bastante tiempo, hasta que encontré esta solución. Funcionó perfectamente para mí – petstran

+0

Yo también encontré este error sutil, es difícil de depurar. En los documentos de MSDN se menciona que las enumeraciones de valor cero no se serializarán (o, más exactamente, los valores enum sin una asignación). https://msdn.microsoft.com/en-us/library/aa347875%28v=vs.110%29.aspx –