我正在转换使用WCF数据服务(因为它们显然已经死了),并尝试使用较新的Microsoft ASP.NET WebApi 2.1构建OData源。我正在寻找一种方法来将我的Feed重命名为与类名不同。
我构建了所有控制器,现在我试图稍微重命名它们以保留set与单个实体的想法。 (例如,Feed应命名为WorkCategories,但类名应为WorkCategory)。这可能吗?我想做这样的事情:
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();
}
我的控制器看起来像这样(从模板构建): public class WorkCategoryController:ODataController { private dcMaintContext db = new dcMaintContext();
// GET odata/WorkCategory
[Queryable]
public IQueryable<WorkCategory> GetWorkCategory()
{
return db.WorkCategories;
}
...
}
但是当我导航到http://localhost/odata/WorkCategories
时,当我重命名任何Feed时,我得到的是:
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'
答案 0 :(得分:2)
啊哈!我发布之后就发现了这个。我只需要将我的控制器类重命名为WorkCategoriesController,将2个Queryable方法重命名为GetWorkCategories而不是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));
}
...
}
答案 1 :(得分:2)
默认情况下,控制器的名称应与EntitySet名称相同,即WorkCategories。 因此,除了WorkCategoriesController之外的其他控制器名称除非您创建自己的IODataRoutingConvention,否则无法工作。
对于方法名称,webapi具有其默认路由规则。
如果要自定义方法名称,可以在webapi 2.2中使用AttributeRouting。 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() {...}