在配置文件中应用[WebInvoke(ResponseFormat = WebMessageFormat.Json)]

时间:2010-05-26 15:57:39

标签: wcf json

我正在编写我所称的POJ(Plain Old JSON)WCF Web服务 - 一个接收和发出标准JSON的服务,没有ASP.NET Ajax喜欢添加的垃圾。

似乎有三个步骤可以实现这一目标:

  1. 在端点标记
  2. 中将“enableWebScript”更改为“webHttp”
  3. 使用[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
  4. 装饰方法
  5. 添加[AspNetCompatibilityRequirements(RequirementsMode。)的咒语 = AspNetCompatibilityRequirementsMode.Allowed)]到服务合同
  6. 这对我来说一切正常 - 我可以传入,并且返回了非常简单的JSON。

    如果我删除了WebInvoke属性,那么我会返回XML,因此它肯定正在做它应该做的事情。但令我感到奇怪的是,指定JSON输出的选项出现在这里,而不是在配置文件中。假设我想将我的方法公开为XML端点 - 我该怎么做?目前我能看到的唯一方法是使用第二种方法完成相同的操作,但没有指定WebMethodFormat.Json。然后冲洗并重复我服务中的每种方法?呸。

    指定输出应该在属性中被序列化为JSON似乎完全违背WCF的原理,其中实现服务是一种传输和编码不可知的方式,留下了如何移动数据的令人讨厌的细节到配置文件。

    有没有更好的方法来做我想做的事情?或者我们是否坚持这个尴尬的属性?或者我不够深入了解WCF?

1 个答案:

答案 0 :(得分:6)

我还没有完全测试过这个,但是,我看了一下反射器中的WebMessageFormat以及它在代码中使用的位置。

webHttp元素的属性名为defaultOutgoingResponseFormat,可以设置为“Json”或“Xml”。

    <behaviors>
      <endpointBehaviors>
        <behavior name="ServicesJSONEndpointBehavior">
          <webHttp defaultOutgoingResponseFormat="Json"/>
        </behavior>
</behaviors>

我遇到了同样的问题,通常在没有太多信息的情况下在线搜索后进行了解决方案。

我会用多个配置的endpointBehaviors给它一个镜头并报告回来。

更新6/5/2011

仅供参考 - 我已经抛弃了香草WCF,其所有的发型方案都应该是简单,有利于ServiceStack(http://servicestack.net/)。如果您希望通过HTTP整合标准的REST风格/面向文档的服务,开箱即用支持JSON / XML / CSV(以及未来的协议缓冲区),并允许您将清洁的MVC放在一起轻松的路线,让ServiceStack看起来很难看。 ServiceStack可以很容易和干净地处理许多事情,由于一些不稳定的配置问题或类似的标准WCF,它总是变成一个主要的PITA。 ServiceStack使用它自己的JSON序列化程序,作为额外的奖励,它比下面的Demis提到的DataContractJsonSerializer和JSON.NET更好。