【发布时间】:2010-01-25 22:39:28
【问题描述】:
我有一个 RESTful WCF 服务,它可以返回 XML、JSON 或 JSONP,具体取决于参数,例如/service.svc/stuff?format=xml 或 service.svc/stuff?format=json&callback=myCallback。为此,我创建了一个自定义 Behavior、MethodEncoder 和 MethodEncoderFactory,它们处理包装 JSONP 回调并根据格式参数选择编写器。在我的编码器的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 中实现这一点?
【问题讨论】: