WebApi, OData and ConventionErrors

本文关键字:ConventionErrors and OData WebApi | 更新日期: 2023-09-27 18:36:33

我正在努力使用 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 attbribute 是预发送的,任何对$metadata的调用都会重新发出:

发生错误。 对象尚未初始化。确保 HttpConfiguration.EnsureInitialized() 在应用程序的 所有其他初始化代码之后的启动代码。 System.InvalidOperationException 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.get_AttributeMappings() 在 System.Web.OData.Routing.TConvention.AttributeRoutingConvention.SelectController(ODataPath odataPath, HttpRequestMessage request) at System.Web.OData.Routing.ODataPathRouteConstraint.SelectControllerName(ODataPath 路径,HttpRequestMessage request) at System.Web.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage 请求, IHttp路由, 字符串参数名称, IDictionary'2 值, HttpRouteDirection routeDirection) at System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage 请求、对象约束、字符串参数名称、 HttpRouteValueDictionary values, HttpRouteDirection routeDirection) at System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage request, HttpRouteValueDictionary values, HttpRouteDirection 路线方向)在 System.Web.Http.Routing.HttpRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) at System.Web.Http.HttpRouteCollection.GetRouteData(HttpRequestMessage 请求)在 System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage 请求,取消令牌取消令牌)在 System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage 请求,取消令牌取消令牌)在 System.Web.Http.HttpServer.d__0.移动下一个()

这就像错误消息一样无用。我从来没有机会看到原始异常,而这个只是告诉我配置不存在 - 这与原始错误没有直接相似之处。

如果我删除 ODataRoute 属性,它可以工作 - 但我显然不能调用该函数。

有什么方法可以忽略实际上从中获得有意义的错误消息吗?显然,ODataRoute 在某个地方出错(有人知道在哪里吗?)并且某处合理的"参数名称 blablbla 不匹配"文本将非常有帮助。

WebApi, OData and ConventionErrors

粘贴的代码有两个问题,1. 在 ODataRoute 中,您错过了"{end}"之后的")"2.您应该将MktSessions定义为实体集,因此您的未绑定函数路由不能与实体集相同,您可以将其更改为其他类似RetrieveMktSessions的内容,因为实体集查询是通过控制器中的get方法启用的,但不是未绑定函数。

如果您还有其他问题,请告诉我们。

回答自己。

现在,在侧面问题中,模板末尾缺少一个 ")"。

不过,更重要的是。

当我在 Owin 配置的末尾添加对 HttpConfiguration.EnsureInitialized() 的调用时,我在那里抛出异常。此异常 - 虽然没有内部异常 - 包含网页输出中丢失的有意义的消息。这样可以更好地进行调试。