8/5/14

Retornar JSON dinámico desde un servicio WCF

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.