【问题标题】:Mixing XML and JSON in RESTful WCF without separate methods在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法
【发布时间】:2010-01-25 22:39:28
【问题描述】:

我有一个 RESTful WCF 服务,它可以返回 XML、JSON 或 JSONP,具体取决于参数,例如/service.svc/stuff?format=xmlservice.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 中实现这一点?

【问题讨论】:

    标签: c# xml wcf rest


    【解决方案1】:

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

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

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

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


    还可以查看 CodePlex 上的 WCF REST Contrib library

    【讨论】:

    • 这有点工作,因为我使用的是 REST 入门工具包中的服务主机,但它确实有效。我将其更改为使用请求参数而不是 Accept 标头。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2012-08-21
    • 2013-02-10
    • 2023-03-24
    • 2010-12-25
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多