Odata web api 404 error

喜欢而已 提交于 2019-12-11 12:38:05

问题


I am new to odata. I have builded a web api with a controller as shown below:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Web.OData.Routing;

namespace HelloWebApi.Controllers
{
public class TestsController : ODataController
{
    //
    // GET: /Product/

    ProductsContext db = new ProductsContext();
    private bool TestExists(int key)
    {
        return db.tests.Any(p => p.key== key);
    }
    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }

    [EnableQuery]
    public IQueryable<test> Get()
    {
        return db.tests;
    }

The model is as shown below:

 public class Test
    {
       [Key]
    public int key { get; set; }
    public string aaa { get; set; }
}

I have also configured routeconfig, odataconfig, webapi config and global.asax file as shown below.

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.Ignore("{resource}.axd/{*pathInfo}");
        routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "{controller}/{action}/{id}"
        );
    }
}

 public class ODataConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Test>("Tests");

        config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
    }
}

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );           

    }
}

The below shown is the global.asax file:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(config =>
        {
            ODataConfig.Register(config); //this has to be before WebApi
            WebApiConfig.Register(config);
        });
        //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

I tried making a lot of modification. But I am getting Http 404 not found error. I tried adding [ODataRoute] attribute to the action method name. When doing that I am getting Http 406 not acceptable response.

The url I am trying is : http://localhost:6701/odata/tests/ where odata is the suffix and tests is the controller name. Please suggest on what I am doing wrong.


回答1:


The routes configured by the ODataConventionModelBuilder are case-sensitive. In your code, you have defined:

  builder.EntitySet<Test>("Tests");

Based on this, the endpoint will be http://localhost:6701/odata/Tests/ (note the upper-case "T" in "Tests").

This is by design, in order to maintain compatibility with the OData specification.

That said, as of Web API OData 5.4, you can optionally enable case-insensitive routes using the HttpConfiguration class's EnableCaseInsensitive() method. E.g., in your ODataConfig.Register() method you could add:

  config.EnableCaseInsensitive(caseInsensitive: true);

For more information, see Basic Case Insensitive Support under Microsoft's ASP.NET Web API for OData V4 Docs.



来源:https://stackoverflow.com/questions/30740084/odata-web-api-404-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!