ASP.NET WebApi更改源路由名称

时间:2014-03-31 21:15:36

标签: c# asp.net-mvc asp.net-web-api wcf-data-services

我正在转换使用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'

2 个答案:

答案 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具有其默认路由规则。

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

如果要自定义方法名称,可以在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() {...}