Un escenario común asociado a servicios WCF que extraen información de CRM es que los valores retornados correspondan con entidades de CRM. Para crear un endpoint de WCF que devuelva esa información en XML o JSON necesitamos especificar un tipo de retorno, pero si queremos que el servicio sea genérico, no podemos atarnos a una implementación concreta de una clase de .NET. Se necesita un tipo que acepte "de todo", como un System.Object, un string o un dynamic. Mi primera opción fue usar un string, pero me encontré que como el valor ya estaba expresado en JSON, WCF lo estaba volviendo a serializar, con lo que acababa con un string con un montón de comillas y caracteres "escapados". Bueno, pues en este blog de Carlos Figueira encontré una opción que no conocía y que permite manejar hasta el nivel de byte el resultado que genera el servicio WCF: devolver un Stream.
[WebInvoke(Method = "GET", UriTemplate = "search/{queryName}/{searchString}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] public Stream Search(string queryName, string searchString) { var jsonString = "....."; WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; return new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); }
La línea en la que se establece el ContentType ayudará al cliente a determinar cuál es el tipo. En este caso sigue siendo JSON, pero igualmente podría ser un generador de imágenes, o cualquier otro tipo de contenido.
No hay comentarios:
Publicar un comentario