2014-04-07 70 views
3

我正在開發一個新的OData項目,並且正在嘗試首次使用Web API 2進行操作。 OData提要非常簡單,與WCF相比,這非常棒。使用Web API指定OData的路徑值

我現在的問題是,我的OData Feed將用於「多租戶」環境中,並且我想根據租戶使用「友好」網址作爲Feed。因此,我非常需要的飼料的URL看起來像這樣:

/store/tenant1/Products 
/store/tenant2/Products 

兩個網址都指向同一個控制器,並最終相同的數據集,但我想執行的租戶一些實體過濾。顯然這將是困難的,並且與標準Web API路由有所不同,因爲我只能指定路由前綴而不是路由模板。

到目前爲止,我已經修改了我的OData控制器作爲租戶名作爲參數,這創下了以下網址時的偉大工程(這不正是我想要的,看到上面的目標):

http://mydomainname/odata/Products?tenantName=test 

使用這個路由定義:

ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Product>("Products"); 
IEdmModel model = modelBuilder.GetEdmModel(); 
config.Routes.MapODataRoute(routeName: "OData", routePrefix: "odata", model: model); 

這是我的控制器上的樣品動作:

[Queryable] 
public IQueryable<Product> GetPproducts(string tenantName) 
{ 
    return _products.Where(p=>p.TenantName == tenantName); 
} 

我不太確定這是否可行,我的最後手段是使用URL重寫規則,但我寧願避免這種情況,並且在代碼中完成所有事情,並以正確的方式完成。

非常感謝您的幫助!

回答

1

經過一番研究,我發現它在這種方式:只需將路由前綴名稱適用於查詢,例如:

public class MoviesController : ODataController 
{ 
    private MoviesContext _db = new MoviesContext(); 

    public IHttpActionResult Get() 
    { 
     var routeName=Request.ODataProperties().RouteName; 
     ODataRoute odataRoute=Configuration.Routes[routeName] as ODataRoute; 
     var prefixName = odataRoute.RoutePrefix; 
     return Ok(_db.Movies.Where(m=>m.Title.StartsWith(prefixName))); 
    } 
    // Other methods here 
} 

注:上面的代碼是基於ODataActionsSample在https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ 現在的OData V4已經成爲OASIS的標準,但v3不是,所以v4似乎是一個很好的起點。

+0

謝謝tanjinfu! –

+0

我其實沒有嘗試過你的選擇,但你指出我OData v4,它解決了我面臨的一堆問題。圖書館仍處於alpha階段,但對於我正在做的事情來說,這足夠好。事實證明,使用Microsoft.AspNet.OData 5.2-alpha1(WebAPi for OData v4),路由似乎只適用於標準Web API控制器,不需要解決方法。另外,我的下一個問題是需要POST(我想要GET)的實體集操作,而這個新的庫支持函數,這正是我之前的操作。再次感謝! –

+0

此解決方案是否需要您定義多個odata路線,每個租戶一個?你的WebApiConfig.cs文件是什麼樣的? – philreed