1

有没有办法在给定客户端传递的参数的方法上动态更改 WebResponseFormat?我默认我的 WebResponseFormat 为 XML,但我想让客户端有机会将格式指定为 JSON 或 XML,如果未指定,则默认为 XML。

目前我正在做以下事情:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

用户可以通过以下方式调用它:

http://localhost/rest/myservice/objects

然后,他们可以通过执行以下操作指定格式:

http://localhost/rest/myservice/objects?format=json

问题是当我尝试通过以下方式设置响应内容类型时:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";

这只是返回 XML,但浏览器会尝试像 JSON 对象一样处理它,而不是将响应序列化为 JSON。

除了使用 Stream 作为返回值并自己序列化响应之外,这甚至可能在 .NET 3.5 中实现吗?如果没有,是否有更好的解决方案?

4

2 回答 2

1

我能够通过执行以下操作来解决此问题:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

[WebGet(UriTemplate = "objects?format=json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
List<SampleObject> GetObjectsInJson();

不是很漂亮,但是如果定义了 format=xml 或者没有定义,它将默认为我的操作合约,但如果定义了 format=json,则默认为第二个操作合约。这成功地将结果返回为所需的 JSON 和 XML。

于 2010-04-01T14:40:33.817 回答
0

对于 .NET 3.5 和 WCF REST 3.5,我不知道有什么方法可以优雅地做到这一点。

.NET 4 和 .NET 4 中的 WCF REST 将支持您使用的“内容协商”策略 - 只需设置ContentType = "application/json"将导致服务自动返回 JSON 而不是 XML。

因此,如果您有任何机会,请等待 .NET 4(应该在 2010 年 4 月中旬发布)并使用它——无论如何,它应该在 WCF 中提供很多改进,尤其是在 WCF REST 领域。

于 2010-03-30T16:03:01.063 回答