2017-01-03 15 views
2

У меня возникла проблема с инъекцией зависимости, когда я пытаюсь добавить собственный атрибут маршрута для своего действия. Все работает отлично, когда я пытаюсь использовать стандартные методы, такие как Get, Post и т.д., но когда я звоню действие FindUsersByRole Я получаю сообщение об ошибке:Исключение при попытке использовать маршрутизацию атрибутов с autofac

System.InvalidOperationException: An error occurred when trying to create a controller of type 'UsersController'. Make sure that the controller has a parameterless public constructor.

Стек след:

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: Type 'Novelis.WebApi.Controllers.UsersController' does not have a default constructor

StackTrace:

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

Вот URLs я звоню:

localhost:81/api/Users - работает отлично

localhost:81/api/test/1/books - Ошибка

Я также разместить мой конфигурационные классы:

Global.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(); 
} 

AutofacConfig:

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

Попробуйте дать '[RoutePrefix ("API/Users")] [Авторизоваться] класс UsersController общественности: ApiController {...}' и 'изменить маршрут FindUsersByRole' как' [Маршрут ("тест/{} Идентификатор роли/books ")]', а затем удалите этот метод, используя url 'localhost: 81/api/users/test/1/books' – Developer

+0

Можете ли вы опубликовать пакеты, которые используете. Знаете ли вы, что есть пакет 'Autofac.WebApi2'? –

+0

@ Разработчик все еще получает ту же ошибку –

ответ

1

Вы используете два различных HttpConfiguration. Тот, который предоставил вам IIS в GlobalConfiguration и тот, который вы вручную создали в Startup

В этом причина вашей проблемы.

Удалить все код HttpConfiguration в Startup.cs, поскольку это вызывает конфликты с IIS и OWIN. Обычно это делается для самостоятельного размещения OWIN Web Api.

Обновлено Startup

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

все остальное может оставаться, как и раньше.

+0

Вот и все! Я не заметил дублирования. Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^