【问题标题】:Applying [WebInvoke(ResponseFormat = WebMessageFormat.Json)] in config file在配置文件中应用 [WebInvoke(ResponseFormat = WebMessageFormat.Json)]
【发布时间】:2010-05-26 15:57:38
【问题描述】:

我正在编写我所说的 POJ(普通旧 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 中实现服务是一种传输和编码不可知的方式,留下了如何移动数据的令人讨厌的细节转到配置文件。

有没有更好的方法来做我想做的事?还是我们被这个尴尬的属性困住了?还是我对 WCF 的理解不够深入?

【问题讨论】:

  • 感谢您提出这个问题

标签: wcf json


【解决方案1】:

我尚未对此进行全面测试,但是,我查看了反射器中的 WebMessageFormat 以及它在代码中的使用位置。

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

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

我遇到了同样的问题,并且在没有太多信息的情况下在线搜索后通常会遇到麻烦。

我将尝试使用多个已配置的端点行为并报告。

2011 年 6 月 5 日更新

仅供参考——我已经放弃了原版 WCF,因为它所有像这样的令人毛骨悚然的场景应该是简单,转而支持 ServiceStack (http://servicestack.net/)。如果您希望通过 HTTP 组合一个标准 REST 样式/面向文档的服务,该服务开箱即用地支持 JSON / XML / CSV(以及未来的协议缓冲区),并且允许您组合干净的 MVC - 风格的路线轻松,让 ServiceStack 看起来很硬。由于标准 WCF 中的一些不稳定的配置问题或类似问题,ServiceStack 将相当容易和干净地处理许多事情,这些事情总是成为主要的 PITA。 ServiceStack 使用它自己的 JSON 序列化程序,作为额外的奖励,它优于 DataContractJsonSerializer 和 JSON.NET,正如 Demis 在下面提到的那样。

【讨论】:

  • 是的,这是正确的答案。我刚刚在我正在处理的 WCF 项目中进行了验证。值得注意的是,WebScriptEnablingBehavior 类具有相同的属性——但是如果您尝试将 defaultOutgoingResponseFormat="Xml" 附加到 enableWebScript 元素上,服务将返回一个 0 字节的响应。默认值在某个地方设置为“Json”,如果您在配置中覆盖它(顺便说一句,它不会显示在 Intellisense 中),那么 BUST。
  • 哈哈...没问题。 WCF 有时是一个需要处理的野兽。
  • 哈利路亚,这是整个互联网上第一个提供 或硬编码 [WebInvoke] 的替代方案,我们都在拼命寻找。
  • 实际上 ServiceStack 使用它自己的 ServiceStack.Text JSON 序列化器,它比 JSON.NET 快 3 倍,比 WCF 的 DataContractJsonSerializer 快 3.6 倍 :)
  • Demis -- 哎呀,很抱歉错误信息。没有看过你的那部分代码,我以为你是在搭载 JSON.NET。感谢您的澄清;0
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 2021-10-10
  • 2011-02-20
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多