C# WebApi、OData和ConventionErrors
我正在用ODataWebAPI的方式来配置路由,主要是因为无法获得任何合理的调试信息 所讨论的API是服务器服务的一部分,如:windows服务和基于OWIN的服务 例如,我有以下功能: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
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上中断,即使我已在异常设置中检查了它