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'
默认情况下,控制器的名称应与实体集名称相同,即 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));
}
...
}