2010-06-07 13 views
5

tengo un recurso que se ve algo como esto:Adjuntar archivos a las respuestas de servicio WCF REST

/users/{id}/summary?format={format} 

Cuando format es "xml" o "json" respondo con un objeto de resumen de usuario que obtiene automagicamente codificada por WCF bien hasta ahora. Pero cuando format es igual a "pdf", quiero que mi respuesta consista en un cuerpo de respuesta HTTP trivial y un archivo PDF adjunto.

¿Cómo se hace esto? La piratería en WebOperationContext.Current.OutgoingResponse no parece funcionar, y no sería lo correcto, incluso si lo hiciera. Incluyendo los bits del archivo en una sección CDATA o algo en la respuesta isn't safe. ¿Debo crear una subclase de Message, y luego proporcionar un IDispatchMessageFormatter personalizado que responda con ella? Recorrí una corta distancia por ese camino, pero finalmente encontré la documentación opaca.

¿Qué es lo correcto?

Respuesta

6

Resulta que lo que necesito es el modo WCF "raw", como se describe here. En términos generales, quiero hacer esto:

[OperationContract, WebGet(UriTemplate = "https://stackoverflow.com/users/{id}/summary?format={format}"] 
public Stream GetUserSummary(string id, string format) 
{ 
    if(format == "pdf") 
    { 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf"; 
     return new MemoryStream(CreatePdfSummaryFileForUser(id)); 
    } 
    else 
    { 
     // XML or JSON serialization. I can't figure out a way to not do this explicitly, but my use case involved custom formatters anyway so I don't care. 
    } 
} 
+0

Hola, es curioso si pudieras compartir cómo configuraste el enlace del cliente para que esto funcione ... –

+0

No hay uno, es REST, pulsas una URL y recibes una respuesta HTTP . Hvae ¿Te he entendido mal? –

3

En teoría, podría hacerlo con un tipo de contenido MIME de varias partes (consulte http://www.faqs.org/rfcs/rfc2387.html). Sin embargo, sería mucho más fácil devolver una URL en la respuesta XML/JSON y el cliente puede hacer un GET en ese enlace para devolver el archivo.

+0

+1 para esta respuesta. ¿Devolver una URL se considera la mejor práctica? (en lugar de devolver un archivo completo) – rexposadas

Cuestiones relacionadas