2012-04-27 19 views
5

我试图让Autofac与WebApi一起工作。我有我的ApiControllers在一个单独的项目从主要的Web项目。ASP.NET WebApi + Autofac没有找到ApiControllers

InventorySystem.Web.UI InventorySystem.Web.Api.Controllers

每当我试图浏览到一个API的路线我得到的回应:

<Exception xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ExceptionType>System.ArgumentNullException</ExceptionType> 
    <Message>Value cannot be null. Parameter name: value</Message> 
    <StackTrace> 
at System.Web.Http.Controllers.HttpControllerContext.set_Controller(IHttpController value) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance(HttpControllerContext controllerContext, HttpControllerDescriptor controllerDescriptor) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at Autofac.Integration.WebApi.AutofacControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    </StackTrace> 
</Exception> 

当我通过Autofac代码我一步看到我的控制器已被注册,但AutofacControllerActivator.Create()返回null。特别是行 返回(ResolutionExtensions.ResolveOptional(scope,controllerType)作为IHttpController);

自动代码: string binDirectory = Path.Combine(HttpRuntime.AppDomainAppPath,“bin”);

 var builder = new ContainerBuilder(); 

     builder.ConfigureWebApi(GlobalConfiguration.Configuration); 

     builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
     builder.RegisterApiControllers(Assembly.LoadFile(Path.Combine(binDirectory, "InventorySystem.Web.Api.dll"))).PropertiesAutowired(); 
     builder.RegisterFilterProvider();    

     var container = builder.Build(); 

     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new AutofacWebApiDependencyResolver(container)); 

我错过了什么吗?

感谢

+0

您提供给RegisterAPIControllers的组装位置是否正确?当我的程序集名称出错时,我得到了同样的错误。 – Gavin 2012-04-29 13:27:46

+0

@Gavin是的,因为我的apicontroller确实被注册。这只是似乎失败的解决办法。 – user695595 2012-04-29 14:45:32

回答

0

你是不是忘记注册的构造函数依赖于与建集装箱你的API控制器?

HostingEnvironment.MapPath(“〜/ bin”)是获取bin目录中文件路径的另一种好方法。

+0

不幸的是,没有帮助。 – user695595 2012-05-03 16:34:44

1

RegisterApiControllers注册扩展寻找实现IHttpController接口的类型,并且名称以“Controller”结尾。你的控制器类名是否有后缀“Controller”?

+0

是的,它最终实现了IHttpController,名称也以Controller结束。 另外,如果我把我的API控制器在主项目中工作正常。 我会尝试创建一个测试项目来演示问题。 – user695595 2012-05-03 16:32:57

+0

我也不确定如果 lifetimeScope.ResolveOptional(controllerType)返回null 或转换为IHttpController。任何方式我可以很容易地检查这个? – user695595 2012-05-03 17:18:35

+0

(我们在同一个地方工作,因此我可以访问代码):builder.RegisterApiControllers(typeof(InventorySystem.Web.Api.Controllers.InventoryController).Assembly).PropertiesAutowired();解决了这个问题,但是我们希望能够使用Assembly.Load,这样我们就可以在不同的实现之间切换。请咨询我们为什么看到这种行为。 (并且:感谢Autofac集成模块!我们喜欢Autofac以及与它完美集成的所有产品) – 2012-05-03 18:03:34

2

你可能想给看看这个SO question,其中其他组件拿起从参考API控制器的一个开始。

0
var builder = new ContainerBuilder(); 
builder.Update(container); 
var webApiResolver = new Autofac.Integration.WebApi.AutofacWebApiDependencyResolver(container); 
    System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;