【问题标题】:Exception trying to use attribute routing with autofac尝试将属性路由与 autofac 一起使用时出现异常
【发布时间】:2017-01-03 09:42:28
【问题描述】:

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

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()

内部异常:

System.ArgumentException:类型“Novelis.WebApi.Controllers.UsersController”没有默认构造函数

堆栈跟踪:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

这是我的控制器的一部分:

[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");
    }
}

这是我要调用的网址:

localhost:81/api/Users - 工作正常

localhost:81/api/test/1/books - 错误

我还发布了我的配置类:

全球.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    AutofacConfig.Register();
}

自动配置配置:

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);
    }
}

【问题讨论】:

  • 尝试给出[RoutePrefix("api/Users")][Authorize] public class UsersController : ApiController {...}并将FindUsersByRole路由修改为[Route("test/{roleId}/books")],然后点击使用urllocalhost:81/api/users/test/1/books的方法
  • 能否请您发布您正在使用的包。你知道有包Autofac.WebApi2吗?
  • @Developer 仍然遇到同样的错误
  • @ebramkhalil 是的,我正在使用它。我还安装了:Autofac、Autofac MVC5。你想让我把所有其他的都贴出来吗?就像我说的那样,在我尝试使用自定义路线之前,所有操作都可以正常工作。看起来 Autofac 没有进行注入。
  • @MateuszMigała,根据您的尝试,似乎 DefaultApiAttribute Routing 之前执行

标签: c# asp.net-web-api autofac asp.net-web-api-routing


【解决方案1】:

您正在使用两个不同的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);        
    }
}

其他一切都可以保持原样。

【讨论】:

  • 就是这样!我没有注意到重复。非常感谢!
猜你喜欢
  • 2015-09-28
  • 2014-03-29
  • 2013-08-29
  • 2016-05-21
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多