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

Mik*_*ain 6 wcf json

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

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

  1. 在端点的标记中将"enableWebScript"更改为"webHttp"
  2. 使用[WebInvoke(ResponseFormat = WebMessageFormat.Json)]装饰方法
  3. 在服务合同中添加[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]的咒语

这对我来说都很好 - 我可以传入并且返回了很好的JSON.

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

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

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

Eth*_*own 6

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

webHttp元素的属性名为defaultOutgoingResponseFormat,可以设置为"Json"或"Xml".

    <behaviors>
      <endpointBehaviors>
        <behavior name="ServicesJSONEndpointBehavior">
          <webHttp defaultOutgoingResponseFormat="Json"/>
        </behavior>
</behaviors>
Run Code Online (Sandbox Code Playgroud)

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

我将用多个配置的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更好.