在ODataController端点上指定$ select时出现序列化错误

时间:2016-10-04 14:55:38

标签: asp.net-web-api2 odata owin

我一直在使用Web API 2和OWIN开发RESTful Web服务。最初我的控制器继承自ApiController,GET操作支持OData过滤/查询,即标有[EnableQuery]。

我们现在决定查看是否可以公开真正的OData服务,因此我们的控制器继承自ODataController而不是ApiController。虽然这似乎在大多数情况下运作良好,但$ select不再有效。

public class BaseController : ODataController
{
    ... some properties here, not related to issue...
}


public class EmployeesController : BaseController
{
   private readonly AppDbContext _context = new AppDbContext();

   [EnableQuery]
   public IQueryable<Employee> Get()
   {
       return _context.Employees;
   }
   ...
}

我看到的错误是:

{
  "error": {
    "code": "",
    "message": "An error has occurred.",
    "innererror": {
      "message": "'DbQuery`1' cannot be serialized using the ODataMediaTypeFormatter.",
      "type": "System.Runtime.Serialization.SerializationException",
      "stacktrace": "   at System.Web.OData.Formatter.ODataMediaTypeFormatter.GetSerializer(Type type, Object value, ODataSerializerProvider serializerProvider)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Owin.HttpMessageHandlerAdapter.<BufferResponseContentAsync>d__13.MoveNext()"
    }
  }
}

我很困惑这是如何使用ApiController,但不是ODataController!有什么我想念的吗?

干杯!

1 个答案:

答案 0 :(得分:0)

好的,我已经弄清楚发生了什么:

我尝试将OData软件包更新为OData v4支持的最新版本。 Microsoft .Net OData库名称空间在OData v3(System.Web.Http.OData)和v4(System.Web.OData)之间已更改。我以某种方式设法混合这些库,使得我在旧的OData库中引用了EnableQuery属性,这导致了序列化问题。

跟踪不是一个明显的问题 - 当属性具有相同的名称但位于不同的名称空间并且实际上属于完全不同的版本时,发生的情况并不明显!