Asp.net mvc 4 使用MVC4+时收到406状态代码错误;奥达塔+;可质疑

Asp.net mvc 4 使用MVC4+时收到406状态代码错误;奥达塔+;可质疑,asp.net-mvc-4,asp.net-web-api,odata,iqueryable,http-status-code-406,Asp.net Mvc 4,Asp.net Web Api,Odata,Iqueryable,Http Status Code 406,在MVC4和.NET4上,我只能使用最简单的OData场景。 这是我的WebApiConfig文件: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Client>("Cl

在MVC4和.NET4上,我只能使用最简单的OData场景。
这是我的WebApiConfig文件:

        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Client>("Client");

        config.Routes.MapODataRoute(
          routeName: "odataapi",
          routePrefix: "api",
          model: builder.GetEdmModel()
        );
        config.EnableQuerySupport();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.EnableQuerySupport();
        config.EnableSystemDiagnosticsTracing();
        config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling =
              Newtonsoft.Json.PreserveReferencesHandling.All;
dbcontext是常规EF6上下文。
当我执行请求时,我收到406个错误。
我检查了所有可用的信息,没有发现它不起作用的原因。
可能是OData从MVC5开始工作,而在MVC4中它仍然太多了

  • 在Web API OData中,约定控制器类的名称遵循以下模板:

    public class {EntitySetName}Controller : ODataController
    {
        // ...
    }
    
    从模型生成器中选择以下内容:

    builder.EntitySet<Client>("Client");
    
    但是从跟踪中,您的请求uri是:
    Url=[some\u link]/api/ODataGrid
    它与上述odata路线不匹配,而是与您的第二条路线匹配:

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional });
    
    虽然它可以路由和调用“Get”方法,但是“DefaultApi”路由不能序列化从“Get”方法返回的结果。所以,答案是“406”

  • 您可以执行以下操作以使其正常工作:

    将ODataGridController更改为ClientController
    删除maphttroute(…)调用
    将请求发送为:Url=[some_link]/api/Client

  • 问题就在这里:

    config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
    
    我改变了一切没有,一切都解决了。 这也是一个问题:

    builder.EntitySet<Client>("Client");
    
    builder.EntitySet(“客户端”);
    
    您在WebApiConfig和您的控制器中使用了哪些OData名称空间?下面是
    #2
    描述的,我(1)将OData路由更改为完全不同的门,因为
    路由前缀:“OData”
    (2)使用
    /OData/Client
    ,效果非常好。从odata返回406不是问题,而是从webapi路由返回。而且,请始终注意,odata是区分大小写的。
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional });
    
    config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
    
    builder.EntitySet<Client>("Client");