Pregunta

Estoy tratando de escribir un servicio web para especificar y requiere un cuerpo de respuesta diferente dependiendo de si el método se completa con éxito o no. He intentado crear dos clases diferentes de DataContract, pero ¿cómo puedo devolverlas y serializarlas correctamente?

¿Fue útil?

Solución

La respuesta es , pero es complicado y pierde una escritura fuerte en su interfaz. Si devuelve una transmisión , los datos podrían ser xml, texto o incluso una imagen binaria. Para las clases de DataContract, luego serializaría los datos utilizando el DataContractSerializer .

Vea el BlogSvc y más específicamente el RestAtomPubService.cs Servicio WCF para obtener más detalles. Tenga en cuenta que el código fuente también le mostrará cómo aceptar diferentes tipos de datos en un método de descanso WCF que requiere un mapeador de tipos de contenido.

Otros consejos

La mejor manera de indicar que su servicio web WCF ha fallado sería lanzar una FaultException. Hay configuraciones en los archivos web.config de su servicio que permiten que todo el mensaje de error se pase al cliente como parte del error.

Otro enfoque puede ser heredar ambos resultados de la misma clase base o interfaz. El servicio devolvería una instancia del tipo base. Luego puede usar el atributo KnownType para informar al cliente que se pueden devolver varios tipos. Ahora que lo pienso, podría ser posible usar Object como el tipo base, pero no lo he probado.

Si falla alguno de esos enfoques, puede crear un objeto de resultado personalizado que contenga propiedades de resultado y error y su cliente puede decidir qué curso de acción tomar. Tuve que usar este enfoque para Silverlight 2 porque Beta 2 aún no es totalmente compatible con los contratos de fallas. No es bonito, normalmente no lo recomendaría, pero si es la única forma en que funciona o siente que es el mejor enfoque para su situación ...

Si tiene problemas con ADO.NET Data Services, tengo menos experiencia allí.

Aquí hay información sobre la implementación de FaultContracts

Si está utilizando un enlace basado en xml, creo que no hay forma de hacerlo. Una solución simple en ese caso sería simplemente tener una parte del indicador de mensaje si hubo una falla, y almacenar la información de la falla en algún lugar si fuera necesario. Para un enlace JSON, puede usar un método que devuelva un objeto y luego devolver dos tipos diferentes de objetos. Si no recuerdo mal (lo cual es raro), eso es posible porque la clase JavaScriptSerializer usa la reflexión si el objeto no tiene atributos de serialización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top