2011-12-12 22 views
5

Tengo un proyecto de servicio de reposo WCF configurado que sirve a las estructuras de datos JSON. He definido un contrato en un archivo de interfaz como:Devolver datos no JSON, no XML en el servicio WCF REST

[OperationContract] 
[WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "location/{id}")] 
Location GetLocation(string id); 

Ahora el servicio Web tiene que volver multimedia (imágenes, documentos PDF) documentos como lo hace un servidor Web estándar. El WCF WebMessageFormat del ResponseFormat solo es compatible con JSON o XML. ¿Cómo defino el método en la interfaz para devolver un archivo?

Algo así como:

[OperationContract] 
[WebInvoke(Method="GET", 
    ResponseFormat = ????? 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "multimedia/{id}")] 
???? GetMultimedia(string id); 

Así que: wget http://example.com/multimedia/10 devuelve el documento PDF con id 10.

+0

eche un vistazo a esto: http://stackoverflow.com/questions/2992095/attaching-files-to-wcf-rest-service-responses – pdiddy

+0

Gracias pdiddy, resolvió el problema y contiene información adicional interesante. – Pierre

Respuesta

3

Usted puede obtener un archivo del servicio REST como se muestra a continuación:

[WebGet(UriTemplate = "file")] 
     public Stream GetFile() 
     { 
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/txt"; 
      FileStream f = new FileStream("C:\\Test.txt", FileMode.Open); 
      int length = (int)f.Length; 
      WebOperationContext.Current.OutgoingResponse.ContentLength = length; 
      byte[] buffer = new byte[length]; 
      int sum = 0; 
      int count; 
      while((count = f.Read(buffer, sum , length - sum)) > 0) 
      { 
       sum += count; 
      } 
      f.Close(); 
      return new MemoryStream(buffer); 
     } 

Cuando busque el servicio en IE, debería mostrar un diálogo de guardar para la respuesta.

NOTA: Debe establecer el tipo de contenido apropiado del archivo que devuelve su servicio. En el ejemplo anterior, devuelve un archivo de texto.

+0

Gracias. Tenga en cuenta que el tipo de contenido para un archivo de texto suele ser "text/plain". – Pierre

+0

¿Y el contrato? –

Cuestiones relacionadas