WebApi,OData和ConventionErrors
我很苦恼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不匹配”文本将会非常有帮助。
回答我自己。
现在,在侧面的问题是在模板的末尾有一个缺失的“)”。
虽然更重要。
当我添加一个调用到HttpConfiguration.EnsureInitialized()到Owin配置的结尾,然后我得到抛出的异常。这个异常 - 虽然没有内部异常 - 包含一个在网页输出中丢失的有意义的消息。这允许更好的调试。
什么是“有意义的消息”?我收到了在IIS中设置的现有MVC api旁边设置odata方法的完全相同的错误,但是当我在App_Start中调用EnsureInitialized()时,我没有收到任何异常。即使我在异常设置中选择了它,VS 2015也不会在System.InvalidOperationException中发生 – user1664043
没有与你的代码粘贴两个问题, 1.在ODataRoute,你错过了“)”之后“{结束}” 2.您应该定义为MktSessions实体集,所以你的绑定功能路由可以与实体集不同,您可以将其更改为其他类似RetrieveMktSessions,因为EntitySet查询是通过控制器中的get方法启用的,但不是未绑定的函数。
让我们知道您是否还有其他问题。
一个正确的,两个错误的,错过了真正的问题。 – TomTom
您已将函数参数声明为DateTimeOffset,但方法签名使用DateTime。不是说这是问题的根源,但你应该改正它。 – lencharest
另外,我无法从问题中的信息中重现问题。 – lencharest