2010-08-16 9 views
5

probablemente sea algo que estoy haciendo mal, pero estoy devolviendo XML de mi servicio WCF Rest que está creado con VS 2010. En el violinista puede ver aquí que regresa prueba/html como el tipo de contenidoWCF REST: especifique el tipo de contenido en WebGet El atributo no parece funcionar

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 222 
Content-Type: text/html; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Mon, 16 Aug 2010 20:49:55 GMT 

Así que fui por delante y añadió lo siguiente en el atributo WebGet en mi método, pero sigue devolviendo text/html ... supongo que debo devolver el contenido tipo de texto/xml porque de hecho estoy devolviendo XML?

Heres mi método, he añadido el ResponseFormat al atributo ... no estaba segura de si necesitaba estilo de carrocería (no tengo ni idea de lo que hace, pero lo vio en un ejemplo :-))

[WebGet(UriTemplate = "", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)] 
    public List<SampleItem> GetCollection() 
    { 
     // TODO: Replace the current implementation to return a collection of SampleItem instances 
     return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } }; 
    } 

de todos modos después del cambio y la reconstrucción del proyecto, todavía devuelve el tipo de contenido incorrecto ... ¿falto algo?

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 222 
Content-Type: text/html; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Mon, 16 Aug 2010 20:54:15 GMT 

EDITAR

Ok me dieron una solución de trabajo pero el método atributo no tiene efecto, muy extraño ... pero si pongo este

WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 

Ahora puedo comprobar violinista y el tipo de contenido es en realidad texto/xml.

Pero necesito poner esto en cada método y el método de atributo parece no tener ningún efecto.

¿Alguien sabe por qué?

+0

Lo hago funcionar, pero no entiendo por qué el atributo NO TIENE EFECTO. Actualizaré mi pregunta. –

+0

No estoy seguro si todavía está interesado en esta pregunta (han pasado unos días), pero ¿cómo está solicitando este servicio? jQuery, ¿algo más? Creo que está recibiendo texto/html porque eso es lo que se envía en el encabezado Aceptar de la solicitud (o ContentType). ¿Puede actualizar cómo está solicitando el servicio y qué violín dice que son sus encabezados de solicitud? ¡Gracias! –

+0

Hola D Hoerster, sí, todavía estoy interesado ... Estoy haciendo una simple solicitud usando firefox y mis encabezados están incluidos en la pregunta anterior .... Copiado y pegado de un violinista. Gracias –

Respuesta

0

See v.g.

WCF ResponseFormat For WebGet

Creo que desee, por ejemplo,

OutgoingWebResponseContext context = 
    WebOperationContext.Current.OutgoingResponse; 
context.ContentType = "image/jpeg"; 

ResponseFormat controla algo más.

+0

Hola Brian, gracias ... bueno, he estado leyendo esto y a menos que esté equivocado ... esto es para cuando quieras devolver formatos CUSTOM que no son compatibles pero el formato xml es compatible ..... mira aquí http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx Así que supongo que debería funcionar, pero no es –

5

Según this las cabeceras de solicitud Firefox tiene una prioridad más alta para text/html de text/xml, lo que resulta en los métodos de servicio WCF decoradas con XML o JSON volviendo con la respuesta "incorrecta", aunque puedo imaginar es el comportamiento correcto.

Puede forzar un tipo de contenido de la respuesta al establecer explícitamente

WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 

o equivalente. Supongo que esta es la única alternativa si realmente desea forzar una respuesta de tipo de contenido específico para todos los navegadores/clientes.

0

Mensaje viejo, pero aquí es lo que he encontrado en el blog de MSDN Getting Started with WCF WebHttp Services in .NET 4:

Su proyecto tiene que utilizar el .NET Framework 4 completa, no el perfil de cliente.

Una vez que hice eso y reinicié el proyecto, pude agregar System.ServiceModel.Web de la lista de Referencias.

Espero que esto ayude a alguien.

Cuestiones relacionadas