c# - 在没有单独方法的情况下在 RESTful WCF 中混合 XML 和 JSON

标签 c# xml wcf rest

我有一个 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 但使用我的自定义绑定(bind)元素:

[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 吗?或者我是否只需要让步并编写单独的方法(和 URI 模板),这些方法对/json/* 和/xml/* 具有不同的 ResponseFormat 属性?

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

最佳答案

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

This blog post处理您描述的情况:根据传入请求改变响应的内容类型。但是,该帖子描述了一种略有不同的解决方法。

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

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


另请查看 WCF REST Contrib library在 CodePlex 上。

关于c# - 在没有单独方法的情况下在 RESTful WCF 中混合 XML 和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136225/

相关文章:

c# - 如何获得像列表框这样的WP市场?

java - 在 Jaxb 2.1 中使用 @XmlTransient 注释 java 方法时出现的问题

c# - 用于监视目录中文件更改的 WCF 服务

IIS 7/WAS 上的 WCF net.tcp 端口共享

c# - Windows 硬重启

c# - .Net 核心 2.2 未将 302 的状态代码更新为 401。OnRedirectToLogin 事件未触发

c# - c#中的字符串比较

xml - 按属性对 XML 进行排序和修改

c++ - MSXML DOM : Add namespace declaration to an existing node in a tree

c# - WCF 到 Entity Framework 将我的日期时间转换为本地时间 - 如何停止?