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 配置的末尾时,我会在那里抛出异常。此异常 - 虽然没有内部异常 - 包含网页输出中丢失的有意义的消息。这允许更好的调试。