WebApi oData返回406

时间:2015-03-27 15:55:17

标签: c# asp.net-web-api asp.net-mvc-5 odata

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

当我单步执行代码时,我可以看到路由正在运行,因为我的功能被点击了。我也可以毫无问题地获得$元数据。

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

我看到的与406相关的所有线程似乎都表明它存在路由问题,但我的不能是因为函数被击中了。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

PS:当我从ApiController而不是ODataController继承时,它运行正常。 所以我也有同样的困惑,为什么当路线正确击中时它有406错误。

希望,这有帮助。这是我面临的事情。

答案 2 :(得分:0)

我有类似的实现,其中我有一个基类,该基类使用诸如以下的get方法继承了ODataController

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

其中GetDataInstance是返回IQueryable的虚拟方法。通过更改GetDataInstance()返回IQueryable<EntityClassName>,我能够消除406错误。