使用Autofac WebApi和OData v4的NullReferenceException

时间:2015-12-28 03:35:09

标签: asp.net-web-api odata autofac

我有一个OData v4 WebApi控制器和Autofac WebApi Integration v3.4。我注册了一些Autofac过滤器(不确定是否重要),并在尝试访问OData控制器时出现此错误。我访问标准Api控制器没有问题。我没有看到任何暗示与OData v4和Autofac不兼容的信息。任何人对如何解决这个问题都有任何建议?虽然不是更可取,但我是否需要回滚到以前版本的OData? Autofac很好地集成了,所以我不会用另一个IoC容器替换它。如果需要,我宁愿回滚OData。谢谢!

{
  "error":{
    "code":"","message":"An error has occurred.","innererror":{
      "message":"Object reference not set to an instance of an object.","type":"System.NullReferenceException","stacktrace":"   at Autofac.Integration.WebApi.AutofacWebApiFilterProvider.GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)\r\n   at System.Linq.Enumerable.<SelectManyIterator>d__1`2.MoveNext()\r\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()\r\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n   at System.Linq.Enumerable.<ReverseIterator>d__1`1.MoveNext()\r\n   at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext()\r\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n   at System.Linq.Enumerable.<ReverseIterator>d__1`1.MoveNext()\r\n   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)\r\n   at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline()\r\n   at System.Lazy`1.CreateValue()\r\n   at System.Lazy`1.LazyInitValue()\r\n   at System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping()\r\n   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
    }
  }
}

这是我的OData控制器:

public class RequestsController : ODataController
    {
        private readonly PtoDbContext _db;
        public RequestsController(PtoDbContext db)
        {
            _db = db;
        }

        [EnableQuery]
        public IQueryable<Request> Get()
        {
            return _db.PtoRequests;
        }

     }

这是我的OData路线配置:

ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Request>("Requests");
            config.MapODataServiceRoute(
                routeName: "ODataRoute",
                routePrefix: "odata",
                model: builder.GetEdmModel());

1 个答案:

答案 0 :(得分:0)

https://odata.github.io/WebApi/#13-04-DependencyInjection 对于像AutoFac这样的自定义DI,您需要在使用http配置注册了容器构建器之后,使用另一个OData路由配置重载(具有配置容器构建器的configure操作)。