2012-06-02 16 views
7

Estoy tratando de aprender algo de WCF por mi cuenta. Tengo conocimiento de C#/ASP.net pero soy nuevo en WCF. Estoy usando Visual Studio 2010 para desarrollar algunas aplicaciones mientras aprendo.WCF: deje que el cliente elija el formato de devolución

Desarrollé un pequeño servicio web que actúa como back-end para un TODO/administrador de tareas donde un usuario puede crear/eliminar/editar nuevos eventos; es todo muy simple y básico.

Mis preguntas son las siguientes:

  1. ¿Hay una manera de dejar que el cliente elija el formato de retorno que quiere (por ejemplo, XML/JSON/RDF) sin necesidad de escribir nuevos contratos de operación?
  2. ¿Cómo puedo ver en el cliente el mensaje exacto que me envía el servicio web (para que pueda verificar si es, por ejemplo, una representación json o un mensaje xml).

Respuesta

3

La forma eligen formatos de respuesta de sitios web es a través de content negotiation, y en particular a través del uso de las Accept y Content-Type cabeceras HTTP.

Por ejemplo, si el cliente requiere una respuesta en formato JSON, que enviará al servidor una petición HTTP que se ve algo como esto:

GET /resource HTTP/1.0 
User-Agent: YourClient 1.0 
Accept: application/json 

El servidor, a su vez, responderá con un paquete HTTP de esta manera:

HTTP/1.0 200 OK 
Content-Type: application/json 
Content-Length: 20 

{ "type" : "json" } 

WCF es, por desgracia no está equipado para manejar la negociación del contenido de la caja, pero hay una biblioteca muy agradable de terceros que le permite sin demasiado trabajo llamado WcfRestContrib. Su documentation describe los pasos (bastante simples) que debe realizar para que funcione. Para resumir, hay que

  1. adornar su clase de servicio de acuerdo con los tipos de contenido que desea apoyar,
  2. decorar los métodos que desea que contentarse retorno negociación-consciente, y
  3. un serializable objeto comercial de ese método.

En cuanto a su segunda pregunta, Fiddler es una excelente opción para probar tanto el cliente como el servidor.

+0

Le daré un vistazo a WcfRestContrib más tarde y le responderé. – Morat

1

Mi experiencia es que WCF no es excelente en esta área. MVC es una gran mejora con su concepto de "Resultados de acción" que le permite devolver lo que desee para un punto final dado. (Y supuestamente el nuevo "Web API" será un matrimonio de WCF y características MVC.)

Dicho esto, la forma de WCF más fácil de dejar que el cliente elija el formato de respuesta, es especificar un Stream Tipo de retorno, y serializar el resultado de acuerdo con el requisito.

Así que declare el método de esta manera, y utilice su serializador (s) de elección para JSON y XML.

[OperationBehavior] 
[WebGet()] 
public Stream SomeOperation(string format) 
{ 
    string test = "Hello world"; 
    string encodedResult; 
    if (format.ToLower() == "xml") { 
     // serialize as XML (eg, XML Serializer) 
     HttpContext.Current.Response.ContentType = "text/xml"; 
    } 
    else if (format.ToLower() == "json") { 
     // serialize as JSON (eg, Newtonsoft Json) 
     HttpContext.Current.Response.ContentType = "application/json"; 
    } 
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(encodedResults)); 
    return ms; 
} 

a su segunda pregunta, me gustaría recomendar el uso de una herramienta libre como Fiddler para inspeccionar la respuesta HTTP del servidor prima.

navegadores web
+0

Gracias por mencionar violinista. Lo probaré. Realmente no entendí lo que querías decir con "especificar un tipo de retorno de cadena y serializar el resultado de acuerdo con el requisito". ¿Quiere decir hacer que todos mis contratos devuelvan cadena y manejar la serialización yo mismo? – Morat

+0

@Morat Sí, eso es lo que quise decir. Actualizaré la respuesta con un poco más de detalle. – McGarnagle

+0

Gracias por agregar un ejemplo de código; está más claro ahora. Pero, ¿no codifica todo de la manera que sugieres, me impide aprovechar todos los tipos de datos personalizados que un proxy proporcionaría? También tendría que analizar la respuesta del WebService en lugar de tener los objetos listos de fábrica. – Morat

1

En lugar de buscar un servicio basado en SOAP, puede probar el modelo REST. La nueva forma de crear servicios REST o HTTP utilizando tecnologías MS está utilizando Web API que estará disponible ASP.NET MVC 4.

Ventajas de ocio:

  1. contenido de negociación - El cliente puede especificar los datos- escriba (JSON, XML ..) a través del parámetro Accept-Type en el encabezado Request.

  2. métodos utilizan HTTP estructura similar explícitamente

  3. Directorio URI

y más ..

9

Cuando se crea un servicio REST con WCF, se admite la negociación de contenido.

Simplemente necesita establecer automaticFormatSelectionEnabled en true en el punto final.

Consulte también: WCF Web HTTP Formatting

+0

Acabo de encontrar el enlace de documentación de Microsoft anterior después de 2 horas dolorosas de búsqueda. Esta respuesta necesita más amor y atención, ya que supera a todos los demás. – crush

Cuestiones relacionadas