WebApi、OData 和 ConventionErrors
WebApi, OData and ConventionErrors
我正在努力使用 OData WebApi 方法来配置路由 - 主要是因为无法获得任何合理的调试信息。
有问题的 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 属性,任何对 $metadata 的调用都会在:
An error has occurred.
The object has not yet been initialized. Ensure that
HttpConfiguration.EnsureInitialized() is called in the application's
startup code after all other initialization code.
System.InvalidOperationException
at
System.Web.OData.Routing.Conventions.AttributeRoutingConvention.get_AttributeMappings()
at
System.Web.OData.Routing.Conventions.AttributeRoutingConvention.SelectController(ODataPath
odataPath, HttpRequestMessage request) at
System.Web.OData.Routing.ODataPathRouteConstraint.SelectControllerName(ODataPath
path, HttpRequestMessage request) at
System.Web.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage
request, IHttpRoute route, String parameterName, IDictionary`2 values,
HttpRouteDirection routeDirection) at
System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage
request, Object constraint, String parameterName,
HttpRouteValueDictionary values, HttpRouteDirection routeDirection) at
System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage
request, HttpRouteValueDictionary values, HttpRouteDirection
routeDirection) at
System.Web.Http.Routing.HttpRoute.GetRouteData(String virtualPathRoot,
HttpRequestMessage request) at
System.Web.Http.HttpRouteCollection.GetRouteData(HttpRequestMessage
request) at
System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage
request, CancellationToken cancellationToken) at
System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage
request, CancellationToken cancellationToken) at
System.Web.Http.HttpServer.d__0.MoveNext()
这是一条错误消息,毫无用处。我从来没有机会看到原始异常,而这个只是告诉我配置不存在 - 这与原始错误没有直接相似之处。
如果我删除 ODataRoute 属性它会起作用 - 但我显然不能调用该函数。
有什么方法可以让我忽略实际从中得到有意义的错误信息吗?显然 ODataRoute 在某个地方出错了(有人知道在哪里吗?)并且某个地方的合理 "Parameter name blablbla does not match" 文本真的很有帮助。
您粘贴的代码有两个问题,
1. 在 ODataRoute 中,您在“{end}”之后错过了“)”
2.您应该将MktSessions定义为实体集,因此您的未绑定函数路由不能与实体集相同,您可以将其更改为其他内容,例如RetrieveMktSessions,因为EntitySet查询是通过控制器中的get方法启用的,而不是未绑定函数。
如果您还有其他问题,请告诉我们。
自己回答。
现在,在附带问题中,模板末尾缺少一个“)”。
不过更重要。
当我将对 HttpConfiguration.EnsureInitialized() 的调用添加到 Owin 配置的末尾时,我会在那里抛出异常。此异常 - 虽然没有内部异常 - 包含网页输出中丢失的有意义的消息。这允许更好的调试。
我正在努力使用 OData WebApi 方法来配置路由 - 主要是因为无法获得任何合理的调试信息。
有问题的 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 属性,任何对 $metadata 的调用都会在:
An error has occurred. The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code. System.InvalidOperationException at System.Web.OData.Routing.Conventions.AttributeRoutingConvention.get_AttributeMappings() at System.Web.OData.Routing.Conventions.AttributeRoutingConvention.SelectController(ODataPath odataPath, HttpRequestMessage request) at System.Web.OData.Routing.ODataPathRouteConstraint.SelectControllerName(ODataPath path, HttpRequestMessage request) at System.Web.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage request, IHttpRoute route, String parameterName, IDictionary`2 values, HttpRouteDirection routeDirection) at System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage request, Object constraint, String parameterName, HttpRouteValueDictionary values, HttpRouteDirection routeDirection) at System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage request, HttpRouteValueDictionary values, HttpRouteDirection routeDirection) at System.Web.Http.Routing.HttpRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) at System.Web.Http.HttpRouteCollection.GetRouteData(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.HttpServer.d__0.MoveNext()
这是一条错误消息,毫无用处。我从来没有机会看到原始异常,而这个只是告诉我配置不存在 - 这与原始错误没有直接相似之处。
如果我删除 ODataRoute 属性它会起作用 - 但我显然不能调用该函数。
有什么方法可以让我忽略实际从中得到有意义的错误信息吗?显然 ODataRoute 在某个地方出错了(有人知道在哪里吗?)并且某个地方的合理 "Parameter name blablbla does not match" 文本真的很有帮助。
您粘贴的代码有两个问题, 1. 在 ODataRoute 中,您在“{end}”之后错过了“)” 2.您应该将MktSessions定义为实体集,因此您的未绑定函数路由不能与实体集相同,您可以将其更改为其他内容,例如RetrieveMktSessions,因为EntitySet查询是通过控制器中的get方法启用的,而不是未绑定函数。
如果您还有其他问题,请告诉我们。
自己回答。
现在,在附带问题中,模板末尾缺少一个“)”。
不过更重要。
当我将对 HttpConfiguration.EnsureInitialized() 的调用添加到 Owin 配置的末尾时,我会在那里抛出异常。此异常 - 虽然没有内部异常 - 包含网页输出中丢失的有意义的消息。这允许更好的调试。