WebAPI and ODataController return 406 Not Acceptable

前端 未结 13 1275
余生分开走
余生分开走 2020-12-02 12:25

Before adding OData to my project, my routes where set up like this:

       config.Routes.MapHttpRoute(
            name: \"ApiById\",
            routeTempl         


        
13条回答
  •  天命终不由人
    2020-12-02 13:06

    In my case (odata V3) I had to change name of OdataController to be same as provided in ODataConventionModelBuilder and that solved the issue

    my controller:

    public class RolesController : ODataController
    {
        private AngularCRMDBEntities db = new AngularCRMDBEntities();
    
        [Queryable]
        public IQueryable GetRoles()
        {
            return db.tROLEs;
        }
    }
    

    ODataConfig.cs:

    public class ODataConfig
    {
        public static void Register(HttpConfiguration config)
        {
            ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
            modelBuilder.EntitySet("RolesNormal"); 
            modelBuilder.EntitySet("Roles").EntityType.HasKey(o => o.IDRole).HasMany(t => t.tROLE_AUTHORIZATION);
            modelBuilder.EntitySet("Lookups").EntityType.HasKey(o => o.IDLookup).HasMany(t => t.tROLE_AUTHORIZATION);
            modelBuilder.EntitySet("RoleAuthorizations").EntityType.HasKey(o => o.IDRoleAuthorization);
    
            config.Routes.MapODataRoute("odata", "odata", modelBuilder.GetEdmModel());
            config.EnableQuerySupport();
        }
    }
    

    WebApiConfig.cs:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
    
            // Web API routes
            config.MapHttpAttributeRoutes();
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));            
    
            config.Routes.MapHttpRoute( //MapHTTPRoute for controllers inheriting ApiController
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );
    
            var jsonFormatter = config.Formatters.OfType().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
                .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            GlobalConfiguration.Configuration.Formatters
                .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
        }
    }
    

    Global.asax:

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(config =>
            {
                ODataConfig.Register(config); 
                WebApiConfig.Register(config);
            });            
        }
    }
    

提交回复
热议问题