WebApi oData 返回 406

WebApi oData returning 406

用这个把我的头撞到墙上。我有一个 oDataController return 是一个视图模型实体,但每次调用它时,我都会得到一个 406 客户端。 使用 Web 在 .Net MVC 5 oData v4 中构建此 API 2.

当我单步执行代码时,我可以看到路由正在运行,因为我的函数被命中了。我也可以毫无问题地获取 $metadata。

我已经检查了 return 值 (IQueryable<>) 是有效的服务器端并且确实 return 结果所以在我的函数退出之后和客户端收到响应之前发生了一些事情(邮递员).

我看到的所有与 406 相关的线程似乎都表明这是一个路由问题,但我的不可能,因为函数正在被命中。

有什么想法吗?

所以我想我已经找到了问题,回到基础并设法让网络 api 和 odata 控制器都能很好地工作。为了防止它对其他人有帮助,我首先添加了一个 oData 控制器并确保它可以独立工作。然后我添加了一个同名的 web api 控制器(故意)。在这种情况下,odata 工作但路由到 api 控制器没有(api 调用路由到返回 406 的 odata 控制器)。然后我向两个控制器添加了一个 RoutePrefix 属性,然后两个控制器都工作了。 然后我尝试在应用程序中添加一点复杂性以复制我在其他项目中的内容,即控制器继承,这就是它失败的地方。如果您想知道我为什么使用控制器继承,那是因为我有接受类型参数的通用控制器(我知道这是一个专业用例)。无论哪种方式,它的继承都会混淆 routing/response,即使它正确地路由到我的应用程序中的正确端点(因为我有一个自定义的 ApiSelector 实现)。

对我来说,问题是我返回的实体没有映射到映射到 "GetEdmModel" edmModel 的模型,即调用后返回的数据没有正确映射到资源模型。

PS:当我从 ApiController 而不是 ODataController 继承时,它工作正常。 所以我也有同样的困惑,为什么当路由正确命中时它会出现 406 错误。

希望这对您有所帮助。这是我遇到的事情。

我有一个类似的实现,其中我有一个基础 class,它继承了 ODataController 和一个 get 方法,例如:

public IHttpActionResult Get()
{
    Verify();
    return Ok(GetDataInstance());
}

其中 GetDataInstance 是 returned 一个 IQueryable 的虚拟方法。我能够通过将 GetDataInstance() 更改为 return IQueryable<EntityClassName>.

来消除 406 错误