C# WebApi、OData和ConventionErrors

C# WebApi、OData和ConventionErrors,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我正在用ODataWebAPI的方式来配置路由,主要是因为无法获得任何合理的调试信息 所讨论的API是服务器服务的一部分,如:windows服务和基于OWIN的服务 例如,我有以下功能: function = builder.Function("MktSessions").ReturnsCollection<MktSession>(); function.Parameter<string>("Symbol"); function.Parameter<DateTime

我正在用ODataWebAPI的方式来配置路由,主要是因为无法获得任何合理的调试信息

所讨论的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) {
控制器具有以下签名功能:

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.Conventions.AttributeRoutingConvention.SelectControllerODataPath odataPath,HttpRequestMessage请求位于 System.Web.OData.Routing.ODataPathRouteConstraint.SelectControllerNameODataPath 路径,HttpRequestMessage请求位于 System.Web.OData.Routing.ODataPathRouteConstraint.MatchHttpRequestMessage 请求,IHttpRoute路由,字符串参数名称,IDictionary`2值, HttpRouteDirection路由方向位于 System.Web.Http.Routing.HttpRoute.ProcessConstraintHttpRequestMessage 请求、对象约束、字符串参数名称、, HttpRouteValueDictionary值,HttpRouteDirection routeDirection位于 System.Web.Http.Routing.HttpRoute.ProcessConstraintsHttpRequestMessage 请求,HttpRouteValueDictionary值,HttpRouteDirection 路由定向 System.Web.Http.Routing.HttpRoute.GetRouteDataString VirtualPath, HttpRequestMessage请求位于 System.Web.Http.HttpRouteCollection.GetRouteDataHttpRequestMessage 请求 System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsyncHttpRequestMessage 请求,CancellationToken CancellationToken位于 System.Net.Http.DelegatingHandler.SendAsyncHttpRequestMessage 请求,CancellationToken CancellationToken位于 System.Web.Http.HttpServer.d__0.MoveNext

这是无用的,因为它得到了一个错误消息。我从来没有机会看到原始异常,而这一个jsut告诉我配置不存在——这与原始错误没有直接的相似之处

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


有没有什么方法可以让我从中得到一条有意义的错误信息?显然ODataRoute出了差错有人知道在哪里吗?一个合理的参数名blablbla与某个地方的文本不匹配,这将非常有用。

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

如果您还有任何问题,请告诉我们。

回答我自己的问题

现在,在侧边问题上,模板末尾缺少一个

但更重要的是


当我在Owin配置的末尾添加对HttpConfiguration.EnsureInitialized的调用时,就会在那里抛出异常。此异常(虽然没有内部异常)包含在网页输出中丢失的有意义的完整消息。这允许更好的调试。

您已将函数参数声明为DateTimeOffset,但方法签名使用DateTime。没有说这是问题的根源,但你仍然应该纠正它。而且,我不能从问题中的信息重现问题。什么是有意义的信息?在IIS中现有MVC api集旁边设置odata方法时,我会遇到完全相同的错误,但在App_Start中调用EnsureInitialized时,不会引发任何异常。VS 2015也不会在System.InvalidOperationException上中断,即使我已在异常设置中检查了它