2016-02-28 185 views
-2

我很苦惱OData WebApi配置路由的方式 - 主要是無法獲得任何明智的調試信息。WebApi,OData和ConventionErrors

有問題的API是服務器服務(如:windows服務)的一部分,並且是基於OWIN的。

我有例如以下功能:

function = builder.Function("MktSessions").ReturnsCollection<MktSession>(); 
function.Parameter<string>("Symbol"); 
function.Parameter<DateTimeOffset>("Begin"); 
function.Parameter<DateTimeOffset>("End"); 

和控制器具有以下簽名功能:

[HttpGet] 
[ODataRoute("MktSessions(Symbol={symbol},Begin={begin},End={end}")] 
public IEnumerable<Reflexo.Api.MktSession> MktSessions (string symbol, DateTime begin, DateTime end) { 

什麼是錯在這裏。只要ODataRouter attbribute被預先發送,任何對$元數據的調用都會被終止:

發生錯誤。 該對象尚未初始化。確保 HttpConfiguration.EnsureInitialized()在所有其他初始化代碼之後在應用程序的 啓動代碼中被調用。 System.InvalidOperationException 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.get_AttributeMappings() 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.SelectController(ODataPath odataPath,HttpRequestMessage請求)在 系統。 Web.OData.Routing.ODataPathRouteConstraint.SelectControllerName(ODataPath 路徑,HttpRequestMessage請求)在 System.Web.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage 請求,IHttpRoute路線,字符串參數名稱,IDictionary`2值, HttpRouteDirection routeDirection)在 System.Web.Http.Routing.HttpRoute.ProcessConstraint(Ht tpRequestMessage 請求,對象約束,字符串參數名稱, HttpRouteValueDictionary值,HttpRouteDirection routeDirection)處 System.Web.Http System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage 請求,HttpRouteValueDictionary值,HttpRouteDirection routeDirection)。 Routing.HttpRoute.GetRouteData(字符串virtualPathRoot, HttpRequestMessage請求)在 System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync在 System.Web.Http.HttpRouteCollection.GetRouteData(HttpRequestMessage 請求)(HttpRequestMessage 請求,的CancellationToken的CancellationToken)在 System.Net.Http.D elegatingHandler.SendAsync在 System.Web.Http.HttpServer.d__0.MoveNext((HttpRequestMessage 請求,的CancellationToken的CancellationToken))

這是因爲無用的,因爲它得到一個錯誤消息。我從來沒有機會看到原始異常,這個jsut告訴我配置不存在 - 它沒有直接類似於原始錯誤。

如果我刪除了它的ODataRoute屬性 - 但我顯然不能調用該函數。

有沒有什麼辦法可以讓我忽略從這裏得到一個有意義的錯誤信息?顯然,ODataRoute在某處出錯(任何人都知道在哪裏?),而且某個明智的「參數名稱blablbla不匹配」文本將會非常有幫助。

+0

您已將函數參數聲明爲DateTimeOffset,但方法簽名使用DateTime。不是說這是問題的根源,但你應該改正它。 – lencharest

+0

另外,我無法從問題中的信息中重現問題。 – lencharest

回答

0

回答我自己。

現在,在側面的問題是在模板的末尾有一個缺失的「)」。

雖然更重要。

當我添加一個調用到HttpConfiguration.EnsureInitialized()到Owin配置的結尾,然後我得到拋出的異常。這個異常 - 雖然沒有內部異常 - 包含一個在網頁輸出中丟失的有意義的消息。這允許更好的調試。

+0

什麼是「有意義的消息」?我收到了在IIS中設置的現有MVC api旁邊設置odata方法的完全相同的錯誤,但是當我在App_Start中調用EnsureInitialized()時,我沒有收到任何異常。即使我在異常設置中選擇了它,VS 2015也不會在System.InvalidOperationException中發生 – user1664043

0

沒有與你的代碼粘貼兩個問題, 1.在ODataRoute,你錯過了「)」之後「{結束}」 2.您應該定義爲MktSessions實體集,所以你的綁定功能路由可以與實體集不同,您可以將其更改爲其他類似RetrieveMktSessions,因爲EntitySet查詢是通過控制器中的get方法啓用的,但不是未綁定的函數。

讓我們知道您是否還有其他問題。

+0

一個正確的,兩個錯誤的,錯過了真正的問題。 – TomTom