在RESTful WCF中混合XML和JSON,无需单独的方法

时间:2010-01-25 22:39:29

标签: c# xml wcf rest

我有一个RESTful WCF服务,它可以返回XML,JSON或JSONP,具体取决于参数,例如: /service.svc/stuff?format=xmlservice.svc/stuff?format=json&callback=myCallback。为此,我创建了一个自定义的Behavior,MethodEncoder和MethodEncoderFactory,它处理包装JSONP回调并根据format参数选择writer。在我的编码器的WriteMessage()方法中,我执行类似

的操作
XmlWriter writer = IsXmlRequested() ? XmlDictionaryWriter.CreateTextWriter(stream) :
  JsonReaderWriterFactory.CreateJsonWriter(stream)
message.WriteMessage(writer);

然后,我将我的服务方法定义为只返回JSON但使用我的自定义绑定元素:

[OperationContract, JSONPBehavior, WebGet(ResponseFormat = WebMessageFormat.Json,
  UriTemplate = "stuff")
public List<Thing> GetStuff(){...}

它几乎可以工作。当我要求XML或JSON时,我得到了正确格式的东西,但XML并没有按照我的预期进行序列化。这是XML的样子:

<root type="array">
 <item type="object">
  <FirstPropertyOnAThing>1</FirstPropertyOnAThing>

然而,如果我只是将WebMessageFormat设置为XML,我会得到这样的结果:

<ArrayOfThings xmlns="...>
 <Thing ...>
  <FirstPropertyOnAThing>1</FirstPropertyOnAThing>

我绝对想要后者。我猜这种情况正在发生,因为在创建Message对象时,结果被序列化为字典;我的自定义编码器只是决定如何将该字典写入响应流。因此它获得了正确的编码,但不完全是格式,这已经由ResponseFormat决定。

首先,是吗?如果是这样,我该如何解决这个问题呢?例如,我可以编写自己的WebMessageFormat吗?或者我只需要为/ json / *和/ xml / *提供不同的ResponseFormat属性的单独方法(和URI模板)?

更新:在.net 4中,您可以设置WebOperationContext.Current.OutgoingResponse.Format属性。我想我的问题归结为:有没有办法在.net 3.5中实现这个目标?

1 个答案:

答案 0 :(得分:2)

是的,有一种方法可以在.NET 3.5中完成您想要的,而无需编写单独的方法。

This blog post处理您描述的情况:根据传入请求更改响应的内容类型。但是,这篇文章描述了一种稍微不同的解决方案。

特别是,请求者在请求URL中指定所需的内容类型,而不是在请求的接受标头中。

解决方案涉及使用自定义WebHttpBehavior来检查Accept标头并适当地格式化响应。在我看来,这是一个非常优雅的解决方案您的业​​务逻辑中无需执行任何操作即可获得自适应格式。只需附加行为即可。


另请查看CodePlex上的WCF REST Contrib library