trabajo tipos son segun modalidades los ejemplos duracion cuáles contratos contrato caracteristicas .net wcf contract

.net - tipos - En WCF, ¿las clases de contrato de datos pueden heredarse entre sí?



tipos de contratos ejemplos (3)

En un servicio WCF, tengo dos clases con el atributo [DataContract]. Una de estas clases tiene una relación "is-a" con la otra, por lo que la clase B puede heredar de la clase A. Sin embargo, cuando configuro la herencia entre estas dos clases, ambas denotadas con un atributo [DataContract], los metadatos no se pueden cargar al probar los servicios.

¿Es esto posible en WCF? ¿Me estoy perdiendo otro atributo?

[DataContract] public class A { [DataMember] public MyCustomType AValue1{ get; set; } [DataMember] public MyCustomType AValue2 { get; set; } } [DataContract] public class B: A { [DataMember] public double BValue1{ get; set; } [DataMember] public double BValue2 { get; set; } }

NOTA: los tipos personalizados también se definen mediante contratos de datos.

ACTUALIZAR : A continuación se muestra el error:

Error: no se pueden obtener los metadatos de http://localhost:8002/GISDataServices/mex Si se trata de un servicio de Windows (R) Communication Foundation al que tiene acceso, verifique que haya habilitado la publicación de metadatos en la dirección especificada. Para obtener ayuda sobre la publicación de metadatos, consulte la documentación de MSDN en http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI de error de Exchange: http://localhost:8002/GISDataServices/mex La http://localhost:8002/GISDataServices/mex contiene una referencia que no se puede resolver: '' http://localhost:8002/GISDataServices/mex ''. Receivera:InternalServiceFault El servidor no pudo procesar la solicitud debido a un error interno. Para obtener más información sobre el error, active IncludeExceptionDetailInFaults (ya sea desde ServiceBehaviorAttribute o desde el comportamiento de configuración <serviceDebug>) en el servidor para enviar de nuevo la información de excepción al cliente o active el seguimiento según Microsoft .NET Framework 3.0 Documentación SDK e inspeccione los registros de seguimiento del servidor. HTP GET Error URI: http://localhost:8002/GISDataServices/mex Se produjo un error al descargar '' http://localhost:8002/GISDataServices/mex ''. La solicitud falló con el estado HTTP 400: Solicitud incorrecta.

ACTUALIZACIÓN 2: Ver mi respuesta a continuación.


Basado en esta prueba, debería funcionar bien. ¿Ambas clases tienen constructores por defecto? ¿Estás usando propiedades automáticas? Nota: En esta muestra básica, los atributos no son necesarios. Además, como David Morton lo mencionó en función del elemento que está devolviendo, es posible que necesite el atributo KnownType, no soy 100% pero el tipo conocido podría tener que ir en el contrato de operación.

class Program { static void Main(string[] args) { var serializer = new DataContractSerializer(typeof(Employee)); var employee = new Employee() { Name="Joe", Salary=100000 }; using (var ms = new MemoryStream()) { serializer.WriteObject(ms, employee); ms.Position = 0; var newEmployee = serializer.ReadObject(ms) as Employee; } Console.ReadKey(); } } [DataContract] public class Employee : Person { [DataMember] public decimal Salary { get; set; } } [DataContract] public class Person { [DataMember] public string Name { get; set; } } [ServiceContract] interface IEmployeeService { [OperationContract] Person GetPerson(); [OperationContract] Employee GetEmployee(); [OperationContract] [KnownType(typeof(Employee))] Person GetEmployeeAsPerson(); }


Bien, descubrí la pregunta. La respuesta es ... soy un idiota. No tiene nada que ver con la herencia. En la clase base, tenía un miembro de contrato de datos sin una cláusula de propiedad ''conjunto'', solo un ''obtener''. Doh !!! Poner una cláusula ''set'' lo hizo funcionar como un hechizo.

Perdón por la confusion.


Sí, pero necesita decorar la clase base con [KnownTypeAttribute] construyéndola con el tipo de clase derivada. Por ejemplo:

[DataContract] [KnownType(typeof(B))] public class A { [DataMember] public string Value { get; set; } } [DataContract] public class B : A { [DataMember] public string OtherValue { get; set; } }