OData Web API 404错误

Jac*_*mas 1 odata asp.net-web-api

我是odata的新手。我已经用控制器构建了一个Web api,如下所示:

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;
    }
Run Code Online (Sandbox Code Playgroud)

模型如下图所示:

 public class Test
    {
       [Key]
    public int key { get; set; }
    public string aaa { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我还配置了routeconfig,odataconfig,webapi config和global.asax文件,如下所示。

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

    }
}
Run Code Online (Sandbox Code Playgroud)

下面显示的是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多修改。但是我收到Http 404 not found错误。我尝试将[ODataRoute]属性添加到操作方法名称。这样做时,我得到Http 406不可接受的响应。

我正在尝试的url是:http:// localhost:6701 / odata / tests /,其中odata是后缀,而tests是控制器名称。请建议我做错了什么。

Jer*_*ney 5

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

  builder.EntitySet<Test>("Tests");
Run Code Online (Sandbox Code Playgroud)

基于此,端点将为http:// localhost:6701 / odata / Tests /(请注意,“测试”中的大写字母“ T”)。

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

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

  config.EnableCaseInsensitive(caseInsensitive: true);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见Microsoft的OData V4文档ASP.NET Web API下的区分大小写基本支持