Wcf OData$格式系统查询选项导致错误请求400

Wcf OData$格式系统查询选项导致错误请求400,wcf,json,odata,Wcf,Json,Odata,我有一个非常简单的基于反射的OData示例,在使用Accept头时运行良好并生成json,如图所示。但是,我无法让它使用$format=json参数。每当我添加那个参数时,就会收到错误的请求。根据这一点,它似乎应该起作用: 请注意,其他系统查询选项(如$select)可以正常工作。这是通过VS2010运行的.Net 4。对.Net 4 WCF数据服务使用$format=json开箱即用将无法工作,即使OData规范表示支持它。我不确定微软为什么不直接支持它。但是这种情况有两种解决办法——一种感觉

我有一个非常简单的基于反射的OData示例,在使用Accept头时运行良好并生成json,如图所示。但是,我无法让它使用$format=json参数。每当我添加那个参数时,就会收到错误的请求。根据这一点,它似乎应该起作用:

请注意,其他系统查询选项(如$select)可以正常工作。这是通过VS2010运行的.Net 4。

对.Net 4 WCF数据服务使用$format=json开箱即用将无法工作,即使OData规范表示支持它。我不确定微软为什么不直接支持它。但是这种情况有两种解决办法——一种感觉有点不舒服,另一种有点道理

首先,让人感觉有点不舒服的解决方案是构建一个HttpHandler,它拦截您的请求,读取$format=json querystring参数,然后在删除有问题的$format=json参数的同时向您的请求添加一个accepts头。这在中进行了描述

第二种解决方案(听起来稍微好一点)是使用[JSONPSupportBehavior]属性装饰数据服务。这更有意义,而且更容易实现,因为您不必构建HttpHandler。以下是一些有用的链接:

描述如何使用 信息技术 [JSONPSupportBehavior]的源代码 属性是的,您必须构建 它-我还没有找到一个 下载 我喜欢属性方法,我只是希望它不是从CodePlex下载的…它听起来还不受支持。但这只是我的意见

老实说,如果您有控制权,最好的方法就是在application/json请求中添加一个accepts头,您的服务将自动返回json格式的结果


我希望这能有所帮助。

任何遇到这一点的人。。。您现在可以使用ODataService而不是DataService并从中继承来自动启用此功能。

这是一个好问题。MSDN文档具有误导性,因为它将$format参数显示为有效参数,但故意阻止您直接请求格式化为JSON的数据。我相信这是3.5版本支持的。谢谢你的链接——我在谷歌上搜索到了这个,但一直没有找到。我没有意识到$format被保留了,这解释了400。我是否缺少显示这些错误的设置?我尝试的另一件事是在我的服务上重写OnStartProcessingRequest,并在检测到自定义&Format=Json参数时执行WebOperationContext.Current.OutgoingResponse.Format=WebMessageFormat.Json,但没有任何效果。JSONPSupportBehavior看起来不错—稍微好一点我在Google Chrome中看到了错误——我没有在IE或FF中真正测试错误消息。也许可以在web.config中关闭customErrors mode=?或者通过Fiddler运行它,您应该会看到错误消息。很高兴这有帮助!非常有帮助,谢谢你,先生: