2012-04-06 8 views
12

Ich habe gerade angefangen, ServiceStack zu verwenden, die eine erstaunliche Bibliothek ist.ServiceStack und einen Stream zurückgeben

Allerdings habe ich eine Geschäftsanforderung, wo wir xml und json zurückgeben müssen, wo die XML in einem bestimmten Format sein muss.

Zum Beispiel haben wir bestehende Kunden, die xml des Formats erwarten:

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

also im Grunde eine Reihe von Attributen.

Ich weiß, dass ServiceStack Konzepte von DTOs verwendet und den DataContractSerializer verwendet, der XML-Elemente lieber als in der obigen Form mit XML-Attributen zurückgibt.

Ich mag noch die DTOs für Anfragen verwenden (vorbei in application/xml oder application/json in den Accept-Header) und dann kann ich meine eigenen XML-Strings oder json Strings erstellen und bringt sie dann als:

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

wobei die Ergebniszeichenfolge eine XML-Zeichenfolge oder eine JSON-Zeichenfolge sein könnte.

Ich bemerkte in fiddler die Antwort Content-Type als Text/html.

Mit dem Ansatz, den ich verwende, verletze ich irgendwelche REST-Prinzipien? Wird es Probleme mit dem Inhaltstyp geben, wie er gerade ist (Text/HTML)?

Wenn ich diesen Ansatz verwende, löst es die Geschäftsanforderungen.

bearbeiten

Ich fand, dass ich eine httpResult wie zurückgeben kann:

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

, die gibt den richtigen Content-Type.

Also, ist das der richtige Weg oder werde ich Probleme haben, wenn ich diesen Weg gehe?

Antwort

17

Mit der Rückgabe eines IHttpResult können Sie die genaue Payload, den Inhaltstyp und andere HTTP-Header steuern, wie Sie möchten.

Sie sind auch nicht auf die Rückgabe eines Streams beschränkt, d. H. Sie können mit HttpResult eine XML-Zeichenfolge mit einem anderen Inhaltstyp zurückgeben.

Hier sind einige Links, die besser zeigen, was mit ServiceStack Rückgabetypen möglich ist:

Sie auch eine statische Datei zurückkehren Verwenden einer FileInfo Objekt mit einem optionalen Parameter, der die Datei als Anhang zurückgibt, der den Benutzer dazu auffordert, die Datei herunterzuladen, statt sie im Browser anzuzeigen:

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

Vielen Dank für die Hilfe. –

+0

Wäre es von Vorteil, eine Zeichenfolge anstelle eines Streams zurückzugeben? –

+2

Nein, beide werden direkt in ASP.NETs HttpResponse OutputStream geschrieben. Wenn Sie daher einen MemoryStream verwenden (wenn Sie die Zeichenfolge bereits im Speicher haben), wird zusätzlicher Overhead hinzugefügt. Es ist sinnvoll, eine Zeichenkette zurückzugeben, wenn Sie die Ausgabe streamen wollen (z. B. vermeiden, die gesamte Antwort in den Speicher zu laden). – mythz

Verwandte Themen