2014-03-31 65 views
0

我正在轉換出使用WCF數據服務(因爲他們顯然已經死了),並嘗試使用較新的Microsoft ASP.NET WebApi 2.1構建OData供稿。我正在尋找一種方法來重命名我的提要不同於類名稱。ASP.NET WebApi更改供稿路由名稱

我構建了所有的控制器,現在我試圖稍微重命名它們以保留set和single實體的想法。 (例如,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(); 
} 

我的控制器看起來像這樣(從模板創建): 公共類WorkCategoryController:ODataController { 私人dcMaintContext DB =新dcMaintContext();

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

控制器的名稱應該是相同的缺省使用EntitySet的名稱,它是WorkCategories。 因此,除非您創建您自己的IODataRoutingConvention,否則除了WorkCategoriesController之外的其他控制器名稱將不起作用。

對於方法名稱,webapi具有其默認路由規則。

  • 爲了獲得實體集,GetWorkCategories()和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() {...} 
+0

謝謝馮。我將無法利用2.2版本,因爲這將用於製作......但我很高興它將在稍後得到支持。 – ChrisG

+0

注意:現在版本2.2可用。 – ChrisG

2

阿哈:

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

但導航到http://localhost/odata/WorkCategories當什麼,當我重命名任何飼料的我得到的是一個404!我發佈後發現這一點。我只需要我的控制器類重命名爲WorkCategoriesController和2種可查詢的方法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)); 
     } 
... 
} 
+0

我回答了這個,但還是覺得這似乎有點哈克,所以我沒有接受。如果有更好的方法,請在下面添加它,我會將其設置爲已接受的答案 – ChrisG

+0

這是一個非常奇怪的解決方案,但它也適用於我。謝謝。 – Noel