【问题标题】:Web API: Odata route always returning a 404 responseWeb API:Odata 路由始终返回 404 响应
【发布时间】:2015-08-24 17:53:56
【问题描述】:

我是 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 Not Acceptable 响应。

我要配置的网址是:

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

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

【问题讨论】:

    标签: c# asp.net asp.net-web-api odata asp.net-routing


    【解决方案1】:

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

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

    基于此,端点将是:

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

    注意Tests 中的大写T

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

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

    config.EnableCaseInsensitive(caseInsensitive: true);
    

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

    【讨论】:

    • Web API OData 5.4开始,现在支持不区分大小写。 Here 是一个简单的示例页面。谢谢。 :)
    • 亲爱的 Jeremy, 非常感谢您的建议。现在我可以使用您指定的 URL 在控制器中打断点。但是,现在响应以 HTTP 406 不可接受的形式出现。
    • 嗨,Sam,非常感谢您分享此网址。当我应用 caseInsensitive: true 时,情况是相同的(HTTP 406)。
    • @SamXu 我很遗憾错过了这一点,但很高兴看到它进入了 5.4!非常感谢您和 OData 团队添加了该功能。我已经更新了我的原始答案以反映这一点。
    • @Jeremey & Sam,Infact 发现了另一个问题,因此发生了 406 错误。我们需要使用“使用 System.Web.Http.OData;”而不是“使用 System.Web.OData;”。这解决了我的问题。再次感谢你们帮助我解决了这个问题。万岁我实现了 Odata :)
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2019-07-03
    • 1970-01-01
    • 2019-07-20
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多