Web API: Odata 路由总是返回 404 响应

Web API: Odata route always returning a 404 response

我是 OData 的新手。我构建了一个 ASP.NET Web API 控制器,如下所示:

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

namespace HelloWebApi.Controllers
{
  public class TestsController : ODataController
  {
    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;
    }
  }
}

模型如下图:

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

我还配置了 RouteConfigODdataConfigWebApiConfig,如下所示:

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 }
    );           

  }
}

以及 global.asax 文件:

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);
  }
}

我尝试了一些修改来解决这个问题。但我一直收到 HTTP 404 Not Found 响应。我还尝试向操作方法名称显式添加 [ODataRoute] 属性;这样做时,我反而得到了 HTTP 406 不可接受的响应。

我正在尝试配置的 URL 是:

http://localhost:6701/odata/tests/

其中 odata 是后缀,tests 是控制器名称。请指出我做错了什么。

ODataConventionModelBuilder配置的路由区分大小写。在您的代码中,您定义了:

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

基于此,端点将是:

http://localhost:6701/odata/Tests/

注意Tests中的大写T

这是设计使然,以保持与 OData 规范的兼容性。

也就是说,从 Web API OData 5.4 开始,您可以选择使用 HttpConfiguration class 的 EnableCaseInsensitive() 方法启用不区分大小写的路由。例如,在您的 ODataConfig.Register() 方法中,您可以添加:

config.EnableCaseInsensitive(caseInsensitive: true);

有关详细信息,请参阅 Basic Case Insensitive Support under Microsoft's ASP.NET Web API for OData V4 Docs