2012-04-06 58 views
12

我剛開始使用ServiceStack,這是一個了不起的庫。ServiceStack並返回流

但是,我有一個業務需求,我們必須返回xml和json,其中xml必須是特定的格式。

例如,我們有現有的期望格式的XML客戶:

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

所以基本上一堆屬性。

我知道ServiceStack使用DTO的概念,並使用DataContractSerializer返回xml元素,而不是使用xml屬性在上面的表單中。

我仍然想使用的DTO的請求(通過在應用程序/ xml或application/JSON在接受頭),然後我可以創建自己的XML字符串或JSON字符串,然後返回他們爲:

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

其中結果字符串可以是xml字符串或json字符串。

我注意到小提琴手的迴應Content-Type爲text/html。

隨着我使用的方法,我違反了任何REST原則嗎?目前是否存在Content-Type問題(text/html)?

如果我確實使用這種方法,它確實解決了業務需求。

編輯

我發現我可以返回httpResult爲:

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

這給正確的內容類型。

那麼,如果我沿着這條路線走下去,這是正確的方式嗎?

回答

17

是的,返回IHttpResult將允許您根據需要控制確切的有效負載,內容類型和其他HTTP標題。

此外,您不限於返回一個流,即您可以使用HttpResult返回一個帶有不同內容類型的xml字符串。

這裏有一些鏈接,更好地展示什麼是可能與ServiceStack返回類型:

您也可以返回一個靜態文件使用FileInfo對象,使用可選參數將文件作爲附件返回,這將提示用戶下載文件,而不是嘗試在瀏覽器中查看它:

​​
+0

感謝您的幫助。 – 2012-04-06 21:14:43

+0

返回字符串而不是流會有什麼好處嗎? – 2012-04-06 21:16:59

+2

不,它們都直接寫入ASP.NET的HttpResponse OutputStream。因此使用MemoryStream(如果您已經擁有內存中的字符串)會增加額外的開銷。當你想要輸出流時返回一個字符串是有意義的(即避免將整個響應加載到內存中) – mythz 2012-04-06 21:27:28