2012-04-06 13 views
12

Ho appena iniziato a utilizzare ServiceStack che è una straordinaria libreria.ServiceStack e restituzione di un flusso

Tuttavia, ho un requisito aziendale in cui dobbiamo restituire xml e json dove il xml deve essere nel formato specifico.

per esempio abbiamo clienti esistenti che si aspettano xml del formato:

<service name="service1" type="audio" .../> 

in modo sostanzialmente un gruppo di attributi.

So che ServiceStack utilizza concetti di DTO e utilizza DataContractSerializer che restituisce elementi xml anziché nel modulo sopra con attributi xml.

ho ancora voglia di utilizzare i DTOS per le richieste (di passaggio in application/xml o application/json nell'intestazione Accept) e posso quindi creare le mie stringhe XML o stringhe JSON e poi ritorno, se:

string result = "....xml or json string..."; 
return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

dove la stringa del risultato può essere una stringa xml o una stringa json.

Ho notato nel violinista la risposta Content-Type come text/html.

Con l'approccio che sto utilizzando, sto violando i principi REST? Ci saranno problemi con il Content-Type così com'è attualmente (text/html)?

Se utilizzo questo approccio, risolve i requisiti aziendali.

Modifica

ho trovato che posso restituire un httpResult come:

return new HttpResult(
     new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml"); 

che dà il corretto tipo di contenuto.

Quindi, è questo il modo giusto o avrò problemi se scenderò questa rotta?

risposta

17

Sì restituendo un IHttpResult consente di controllare il payload esatto, Content-Type e altre intestazioni HTTP come si desidera.

Inoltre, non sei limitato a restituire un flusso, ad esempio puoi utilizzare HttpResult per restituire una stringa xml con un diverso Content-Type.

Qui ci sono alcuni link che meglio dimostrano ciò che è possibile con i tipi di ritorno ServiceStack:

È possibile anche restituire un file statico usando un FileInfo oggetto, con un parametro facoltativo per restituire il file come allegato che chiederà all'utente di scaricare il file piuttosto che tentare di visualizzarlo nel browser con:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true); 
+0

Grazie per l'aiuto. –

+0

Potrebbe esserci qualche vantaggio nel restituire una stringa anziché uno stream? –

+2

No, entrambi vengono scritti direttamente su HttpResponse OutputStream di ASP.NET. Pertanto l'uso di un MemoryStream (se si dispone già della stringa in memoria) aggiunge un ulteriore sovraccarico. Ha senso restituire una stringa quando si desidera eseguire lo streaming dell'output (ovvero evitare di caricare l'intera risposta in memoria) – mythz

Problemi correlati