ServiceStack并返回一个流

JD.*_*JD. 12 servicestack

我刚刚开始使用ServiceStack这是一个了不起的库.

但是,我有一个业务需求,我们必须返回xml和json,其中xml必须是特定格式.

例如,我们现有的客户期望xml的格式:

<service name="service1" type="audio" .../>
Run Code Online (Sandbox Code Playgroud)

所以基本上是一堆属性.

我知道ServiceStack使用DTO的概念并使用DataContractSerializer返回xml元素而不是上面的表单中的xml属性.

我仍然希望将DTO用于请求(在Accept头中传入application/xml或application/json)然后我可以创建自己的xml字符串或json字符串,然后将它们返回为:

string result = "....xml or json string...";
return new MemoryStream(Encoding.UTF8.GetBytes(result));
Run Code Online (Sandbox Code Playgroud)

其中结果字符串可以是xml字符串或json字符串.

我在fiddler中注意到Content-Type的响应为text/html.

根据我使用的方法,我违反了任何REST原则吗?Content-Type是否会出现问题(text/html)?

如果我使用这种方法,它确实解决了业务需求.

编辑

我发现我可以返回一个httpResult:

return new HttpResult(
         new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml");
Run Code Online (Sandbox Code Playgroud)

它给出了正确的内容类型.

那么,这是正确的方式,还是如果我沿着这条路走下去,我会遇到什么问题?

myt*_*thz 17

是的,返回IHttpResult将允许您根据需要控制确切的有效负载,Content-Type和其他HTTP Headers.

此外,您不仅限于返回流,即您可以使用HttpResult返回具有不同Content-Type的xml字符串.

以下是一些链接,可以更好地演示ServiceStack返回类型的可能性:

您还可以使用FileInfo对象返回静态文件,并使用可选参数将文件作为附件返回,该附件将提示用户下载文件,而不是尝试在浏览器中查看文件:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true);
Run Code Online (Sandbox Code Playgroud)

  • 不,两者都直接写入ASP.NET的HttpResponse OutputStream.因此,使用MemoryStream(如果已经在内存中有String)会增加额外的开销.当你想要输出流时返回一个字符串是有意义的(即避免在内存中加载整个响应) (2认同)
  • 我需要更长时间才能找到我想要的东西:要使用在*client*-side上返回流的ServiceStack服务,可以通过调用类型为HttpWebReponse的Get <T>来绕过客户端的反序列化器.这样你就可以使用response.GetResponseHeader(string)和reponse.GetResponseStream()来获取标题和底层流. (2认同)