2010-05-26 10 views
6

Escribo lo que me refiero a un servicio web WCF POJ (Plain Old JSON) - uno que toma y emite JSON estándar sin ninguno de los basura que ASP.NET Ajax le gusta agregar a ella.Aplicando [WebInvoke (ResponseFormat = WebMessageFormat.Json)] en el archivo de configuración

Parece que hay tres pasos para lograr esto:

  1. Cambio "enableWebScript" a "webHttp" en la etiqueta del punto final
  2. Decorar con el método [WebInvoke (ResponseFormat = WebMessageFormat.Json)]
  3. Añadir un encantamiento de [AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] para el contrato de servicio

Todo funciona bien para mí, puedo pasar y me devuelven un buen JSON.

Si elimino el atributo WebInvoke, obtengo XML devuelto en su lugar, por lo que ciertamente está haciendo lo que se supone que debe hacer. Pero me parece extraño que la opción de especificar la salida JSON aparezca aquí y no en el archivo de configuración. Digamos que quería exponer mi método como un punto final XML también. ¿Cómo haría esto? Actualmente, la única forma que puedo ver es tener un segundo método que haga exactamente lo mismo, pero que no tenga especificado WebMethodFormat.Json. Entonces enjuague y repita para cada método en mi servicio? Yuck.

Especificar que la salida debe ser serializada a JSON en el atributo parece ser completamente contraria a la filosofía de WCF, donde el servicio se implementa de una manera independiente de transporte y codificación, dejando los desagradables detalles de cómo serán los datos movido al archivo de configuración.

¿Hay una mejor manera de hacer lo que quiero hacer? ¿O estamos atrapados con este atributo incómodo? ¿O no entiendo WCF lo suficientemente profundo?

+0

Gracias por hacer esta pregunta – JeremyWeir

Respuesta

6

Aún no lo he probado completamente, PERO, eché un vistazo a WebMessageFormat en el reflector y dónde se usó en el código.

Hay un atributo del elemento webHttp llamado defaultOutgoingResponseFormat que se puede establecer en "Json" o "Xml".

<behaviors> 
     <endpointBehaviors> 
     <behavior name="ServicesJSONEndpointBehavior"> 
      <webHttp defaultOutgoingResponseFormat="Json"/> 
     </behavior> 
</behaviors> 

Me he encontrado con el mismo problema y, por lo general, resolví problemas después de buscar en línea sin mucha información.

Lo intentaré con múltiples comportamientos de punto final configurados e informaré.

ACTUALIZACIÓN 6/5/2011

FYI - He deshice de WCF de vainilla con todos sus escenarios tirones de pelo así que deben estar sencilla, a favor de ServiceStack (http://servicestack.net/). Si está buscando armar un servicio estándar REST/servicio orientado a documentos a través de HTTP que soporte directamente a JSON/XML/CSV (y en los búferes de protocolos futuros) y que le permita armar MVC limpio rutas de estilo sencillo, dale una mirada dura a ServiceStack. Hay una serie de cosas que ServiceStack manejará de forma bastante fácil y limpia, que siempre resulta ser un PITA importante debido a algún problema de configuración poco convincente o similar en WCF estándar. ServiceStack usa su propio serializador JSON, que como una ventaja adicional, supera a DataContractJsonSerializer y JSON.NET como Demis menciona a continuación.

+0

Sí, esta es la respuesta correcta. Acabo de verificar en un proyecto de WCF en el que estoy trabajando. Nota: la clase WebScriptEnablingBehavior tiene la misma propiedad, pero si intenta insertar defaultOutgoingResponseFormat = "Xml" en el elemento enableWebScript, el servicio devolverá una respuesta de 0 bytes. El valor predeterminado se establece en "Json" debajo del capó en alguna parte y si lo reemplaza en config (que no aparece en Intellisense por cierto), entonces BUSTO. –

+2

Te amo, hombre. –

+0

Jaja ... no hay problema. WCF es una bestia para tratar a veces. –

Cuestiones relacionadas