代码之家  ›  专栏  ›  技术社区  ›  Mike Chamberlain JaredPar

在配置文件中应用[WebInvoke(responseForMat=WebMessageFormat.json)]。

  •  6
  • Mike Chamberlain JaredPar  · 技术社区  · 15 年前

    我写的是我所指的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的理解不够深入?

    1 回复  |  直到 13 年前
        1
  •  6
  •   Ethan J. Brown    14 年前

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

    webhttp元素有一个名为defaultoutgoingresponseformat的属性,可以设置为“json”或“xml”。

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

    我也遇到过同样的问题,在没有太多信息的情况下在线搜索后,我通常会在工作上做些粗枝大叶的工作。

    我将用多个配置的端点行为对其进行一次测试,并进行报告。

    6/5/2011更新

    仅供参考——我已经放弃了香草WCF,它的所有拉毛场景都应该是这样的。 简单的 ,支持ServiceStack( http://servicestack.net/ )如果您希望通过HTTP构建一个标准的REST风格/面向文档的服务,而这个现成的服务支持JSON/XML/CSV(以及未来的协议缓冲区),并且允许您轻松地构建干净的MVC风格的路由,那么请给ServiceStack一个硬朗的外观。由于一些不稳定的配置问题或标准WCF中的类似问题,ServiceStack将非常容易和干净地处理许多事情,结果总是成为主要的PITA。ServiceStack使用它自己的JSON序列化程序,作为额外的奖励,它优于下面提到的DataContractJSonserializer和JSON.net。