ASP.NET WebAPI 更改源路由名称

本文关键字:路由 NET WebAPI ASP | 更新日期: 2023-09-27 17:55:25

我正在转换不再使用 WCF 数据服务(因为它们显然已经死了),并尝试使用较新的 Microsoft ASP.NET WebApi 2.1 构建 OData 源。我正在寻找一种方法来重命名我的提要以不同于类名。

构建了我所有的控制器,现在我正在尝试稍微重命名它们,以保留集合与单个实体的想法。(例如,源应命名为"工作类别",但类名称应为"工作类别")。这可能吗?我想做这样的事情:

public static void Register(HttpConfiguration config)
{
    builder.EntitySet<EmailSequenceItem>("EmailSequenceItems");
    builder.EntitySet<EmailSequence>("EmailSequences");
    builder.EntitySet<WorkCategory>("WorkCategories"); 
    ...
    config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
    config.MapHttpAttributeRoutes();
}

我的控制器如下所示(从模板构建): 公共类工作类别控制器:OData控制器 { private dcMaintContext db = new dcMaintContext();

    // GET odata/WorkCategory
    [Queryable]
    public IQueryable<WorkCategory> GetWorkCategory()
    {
        return db.WorkCategories;
    }
    ...
}

但是当我重命名任何提要时,我得到的是导航到 404 http://localhost/odata/WorkCategories

HTTP/1.1 404 Not Found
Message: No HTTP resource was found that matches the request URI 'http://localhost/odata/WorkCategories'."
MessageDetail: No type was found that matches the controller named 'WorkCategories'

ASP.NET WebAPI 更改源路由名称

默认情况下,控制器的名称应与实体集名称相同,即 WorkCategories。因此,除 WorkCategoriesController 之外的其他控制器名称将不起作用,除非您创建自己的 IODataRoutingConvention。

对于方法名称,webapi 具有其默认路由规则。

  • 对于 get entityset,GetWorkCategories() 和 Get() 将起作用。
  • 对于 get 实体,GetWorkCategory(int key) 和 Get(int key) 将起作用。

如果要自定义方法名称,可以在 webapi 2.2 中使用属性路由。http://blogs.msdn.com/b/webdev/archive/2014/03/13/getting-started-with-asp-net-web-api-2-2-for-odata-v4-0.aspx

[ODataRoute("WorkCategories/WhateverName")]
public IQueryable WhateverName() {...}

啊哈!我在发布后才发现这个。我只需要将我的控制器类重命名为 WorkCategoriesController,并将 2 个可查询方法重命名为 GetWorkCategory 而不是 WorkCategory

 public class WorkCategoriesController : ODataController
 {
        private dcMaintContext db = new dcMaintContext();
        // GET odata/WorkCategory
        [Queryable]
        public IQueryable<WorkCategory> GetWorkCategories()
        {
            return db.WorkCategories;
        }
        // GET odata/WorkCategory(5)
        [Queryable]
        public SingleResult<WorkCategory> GetWorkCategories([FromODataUri] int key)
        {
            return SingleResult.Create(db.WorkCategories.Where(workcategory => workcategory.ID == key));
        }
...
}