Odata SingleResult<;T>;按键查询时在Web API中不可序列化

Odata SingleResult<;T>;按键查询时在Web API中不可序列化,odata,wcf-data-services,asp.net-web-api,asp.net-web-api-odata,Odata,Wcf Data Services,Asp.net Web Api,Asp.net Web Api Odata,尝试使用主键CourseID和odata web.api查找单个记录,方法如下: var editedcourse = container.Courses.Where(c => c.CourseID == ID).SingleOrDefault(); 这是一个错误: <m:innererror> <m:message>The 'ObjectContent`1' type failed to serialize the response body f

尝试使用主键CourseID和odata web.api查找单个记录,方法如下:

var editedcourse = container.Courses.Where(c => c.CourseID == ID).SingleOrDefault();
这是一个错误:

    <m:innererror>
    <m:message>The 'ObjectContent`1' type failed to serialize the response body for content type 'application/atom+xml; charset=utf-8'.</m:message>
    <m:type>System.InvalidOperationException</m:type>
    <m:stacktrace></m:stacktrace>
    <m:internalexception>
      <m:message>'SingleResult`1' cannot be serialized using the ODataMediaTypeFormatter.</m:message>
      <m:type>System.Runtime.Serialization.SerializationException</m:type>

'ObjectContent'1'类型未能序列化内容类型'application/atom+xml'的响应正文;字符集=utf-8'。
System.InvalidOperationException异常
无法使用ODataMediaTypeFormatter序列化'SingleResult'1'。
System.Runtime.Serialization.SerializationException

我认为您必须确保已加载任何关系。作为一种解决方法,您可以创建一个新的DTO(数据传输对象)并将所有需要的内容放入其中。

尝试将下面的代码添加到您的WebApiConfig.cs文件中

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
如果不使用Json格式,我认为前两行是可选的


默认情况下,web.api控制器方法不可查询,因此客户端失败。添加了要修复的注释:
[Queryable(AllowedOrderByProperties=“Id”)]

我在Web API 2.2和6.5.0的OData库中也遇到了同样的异常。当我的操作未枚举任何结果时,即用户使用未具体化实体的键进行查询时,就会发生这种情况。你接受的关于QueryableAttribute的答案在最近一段时间内不起作用,有什么建议吗?我也遇到了同样的问题。这个链接:似乎建议它实际上应该返回404,而不是抛出异常-它没有。所以我想出了一个解决办法:。希望能有帮助(直到他们修好为止)。我也修好了,但我想知道为什么!?为什么它必须是可查询的才能正确序列化?