12

我刚刚开始使用 ServiceStack,这是一个很棒的库。

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

例如,我们现有的客户希望使用以下格式的 xml:

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

所以基本上是一堆属性。

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

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

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

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

我在提琴手中注意到响应内容类型为文本/html。

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

如果我确实使用这种方法,它确实可以解决业务需求。

编辑

我发现我可以将 httpResult 返回为:

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

这给出了正确的内容类型。

那么,这是正确的方法还是如果我走这条路我会遇到问题?

4

1 回答 1

17

是的,返回 IHttpResult 将允许您根据需要控制确切的有效负载、内容类型和其他 HTTP 标头。

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

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

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

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true);
于 2012-04-06T18:10:21.710 回答