C# 尝试将属性路由与autofac一起使用时出现异常

C# 尝试将属性路由与autofac一起使用时出现异常,c#,asp.net-web-api,autofac,asp.net-web-api-routing,C#,Asp.net Web Api,Autofac,Asp.net Web Api Routing,当我试图在我的操作中添加自定义路由属性时,依赖项注入有问题。当我尝试使用标准方法(如Get、Post等)时,一切正常,但当我调用FindUserByRole操作时,我遇到了一个错误: System.InvalidOperationException:尝试创建“UsersController”类型的控制器时出错。确保控制器具有无参数公共构造函数 堆栈跟踪: at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(Htt

当我试图在我的操作中添加自定义路由属性时,依赖项注入有问题。当我尝试使用标准方法(如Get、Post等)时,一切正常,但当我调用FindUserByRole操作时,我遇到了一个错误:

System.InvalidOperationException:尝试创建“UsersController”类型的控制器时出错。确保控制器具有无参数公共构造函数

堆栈跟踪:

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
这是我的控制器的一部分:

[Authorize]
public class UsersController : ApiController
{
    private readonly IUsersRepository _usersRepository;

    public UsersController(IUsersRepository usersRepository)
    {
        _usersRepository = usersRepository;
    }

    //This is working fine
    [HttpGet]
    [ResponseType(typeof(List<UserInfoDto>))]
    public IHttpActionResult Get()
    {
        IList<UserInfoDto> values = _usersRepository.SelectAll();

        if (values == null || !values.Any())
            return Ok();

        return Json(new { collection = values });
    }

    //here I get an error
    [HttpGet]
    [Route("api/test/{roleId}/books")]
    public IHttpActionResult FindUsersByRole(int roleId)
    {
        // association code

        return Ok("test");
    }
}
自动传真配置:

public class AutofacConfig
{
    public static void Register()
    {
        var builder = new ContainerBuilder();

        builder.RegisterModule(new AutoMapperModule());
        builder.RegisterApiControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
        builder.RegisterModule(new NlogModule());
        builder.RegisterModule(new RepositoryModule());

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver =
             new AutofacWebApiDependencyResolver(container);
    }
}
WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Filters.Add(new ExceptionHandlingAttribute());
    }
}
启动:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        ConfigureOAuth(app);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }
}

您正在使用两种不同的
HttpConfiguration
。IIS在
GlobalConfiguration
中提供给您的,以及您在
Startup

这就是你问题的原因

删除
Startup.cs
中的所有
HttpConfiguration
代码,因为它会导致与IIS和OWIN冲突。这通常是针对自托管OWIN Web Api完成的

更新启动

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureOAuth(app);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);        
    }
}

其他一切都可以像以前一样。

尝试给予
[RoutePrefix(“api/Users”)][Authorize]公共类用户控制器:ApiController{…}
并将
FindUsersByRole
路由修改为
[route(“test/{roleId}/books”)]
然后点击url
localhost:81/api/users/test/1/books的方法
你能发布你正在使用的软件包吗。您是否知道还有包
Autofac.WebApi2
?@Developer仍然得到相同的结果error@ebramkhalil是的,我在用它。我还安装了:Autofac、Autofac MVC5。你想让我把其他的都发出去吗?就像我说的,在我尝试使用自定义路由之前,所有操作都正常工作。似乎Autofac没有进行注入。@MateuszMigała,根据您的尝试,似乎在
属性路由之前执行
DefaultApi
,就是这样!我没有注意到复制品。谢谢!
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        ConfigureOAuth(app);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }
}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureOAuth(app);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);        
    }
}