2014-01-30 59 views
5

如何控制OData服務文檔的根元素中的基本URL屬性?在WebApi OData中爲OData服務文檔庫URL提供尾部斜線

我設置了使用的WebAPI的System.Web.Http.OData.Builder.ODataConventionModelBuilder和控制器OData服務從System.Web.Http.OData.ODataController

這一切精美的作品和Excel 2013愉快地訪問數據繼承。

嘗試使用Excel 2010和PowerPivot時出現問題。我知道fix是在沒有Accept頭的情況下發送JSON格式的響應,但我找不到任何有關基本URL的問題的討論。

我已經建立了我的OData路線與config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());,當我打這個網址我得到的<service xml:base="http://localhost/odata" xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"/>

的Excel 2010 +的PowerPivot讀取此URL,並決定這樣的響應,因爲沒有尾隨斜線的基礎上URI,它應該請求具有URI的集合,例如http://localhost/Products而不是http://localhost/odata/Products

我已經通過訪問服務文檔的靜態版本來確認我的懷疑,修改後將斜線添加到基本屬性值,然後爲集合資源請求正確的URL。

我試過通過ASP.Net WebStack源代碼來查看是否可以重寫格式化程序或其他東西,但迷路了。任何建議將不勝感激。

+0

你有沒有解決這個問題,或只是搬到了Excel 2013? – Nikolaj

+0

我最後加入了一個DelegatingHandler,它檢查RequestURI是否適用於OData模型,如果是,則使用RegEx查找基本URL並附加尾部斜槓。可怕的,但它的作品。 – Darran

回答

3

我與PowerPivot有同樣的問題,我設法修復xml:base與它兼容。下面是所需的代碼的一部分:

class MyODataPathHandler : DefaultODataPathHandler 
{ 
    public override string Link(ODataPath path) 
    { 
     if (path.PathTemplate == "~") 
     { 
      return path.ToString() + "/"; 
     } 
     return base.Link(path); 
    } 
} 

config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel(), new MyODataPathHandler(), ODataRoutingConventions.CreateDefault()); 

自定義ODataPathHandler將添加默認路徑多餘的斜線,這會導致一個xml:基礎,PowerPivot中周圍的bug工作。第二個問題是PowerPivot預期XML中的數據,而不是JSON。一種解決方法可以在http://aspnetwebstack.codeplex.com/workitem/820

+0

太棒了!奇蹟般有效。 – Darran

+0

只要小心,即使這可行,這是一種解決方法,可能會引入錯誤。我沒有檢查副作用。 – mlehmk