2013-04-03 90 views
0

我有一個正在運行的Web應用程序,配置爲與區域一起使用Web Api。我有2個區域,管理員和客戶端。這意味着,瞄準控制器我有打電話像這樣的網址:使用Web Api區域配置Odata

/xxxWebClient/api/1.0.0/projectid/Products

,一切工作正常。 這是我routeConfig:

//Route to Client 
     routes.MapRoute(
      name: "Client", 
      url: "Client", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new string[] { "xxx.Web.Areas.xxxWebClient.Controllers" } 
     ).DataTokens.Add("Area", "xxxWebClient"); 

     //Route to Admin 
     routes.MapRoute(
      name: "Admin", 
      url: "Admin", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new string[] { "xxx.Web.Areas.xxxWebAdmin.MvcControllers" } 
     ).DataTokens.Add("Area", "xxxWebAdmin"); 

我現在想啓用OData的,這樣它會針對同一個控制器。問題是我不僅需要使用Odata WebAPI功能,這些功能只需向方法中添加[Queryable]屬性即可使用(但功能很好),但我必須將控制器擴展到新的AsyncEntitySetController以便檢索並使用調用odata url時自動生成的QueryOptions。 我已經有最新的NuGet包(OData的,EDM和空間),並以該項目編譯我不得不這些組件綁定重定向添加到Web.config:

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" /> 
    </dependentAssembly>  
    <dependentAssembly> 
    <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" /> 
    </dependentAssembly> 
    <dependentAssembly> 
    <assemblyIdentity name="System.Spatial" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" /> 
    </dependentAssembly> 

然後我加入這個代碼在Global.asax內(它現在在的Application_BeginRequest(),以使其在每個頁面加載通過,這將是那麼的Application_Start方法內):

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
      modelBuilder.EntitySet<Product>("Products"); 

      Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
      try { 
       GlobalConfiguration.Configuration.Routes.MapODataRoute("ODataRoute", "xxxWebClient/api/1.0.0/projectid", model); 
      } 

的一點是,當我目標我的odata控制器url我得到一個406(不可接受的)狀態代碼。 (例如'xxxWebClient/api/1.0.0/projectid/Products')。

我的控制器的定義是這樣的:

public class ProductsController : AsyncEntitySetController<Product, string> 
{ 

我已經成功測試了此AsyncEntitySetController上的空白測試項目,我希望能夠將其與區域整合。任何想法,不勝感激。感謝名單。

回答

0

看來,根據我在這個主題上找到的唯一資源,我想完成的事情還不可能。請參閱GrahameHorner的評論及其回覆HERE。 反正我找到了解決方法,我的問題是不使用AsyncEntitySetController,而是像以前一樣去ApiController,傳遞ODataQueryOptions作爲控制器的參數,所以它們會被WebAPI自動分析。然後,我可以將C#ODataQueryOptions對象應用於任何我想要的對象。 例控制器類的定義和方法:

public class ProductsController : ApiController 
{ 
    public IEnumerable<Keyword> GetKeywords(ODataQueryOptions<xxx.yyy.Keyword> options) 
    { 
     //my controller stuff 
    } 
}  

注意我鑄造ODataQueryOptions到我想申請的選項爲目標類型。