2017-01-03 1 views
2

내 작업에 맞춤 경로 속성을 추가하려고 할 때 종속성 삽입에 문제가 있습니다. 나는 등 포스트, 취득하지만, 같은 표준 방법을 사용하려고 해요 때 모든 것이 잘 작동됩니다 내가 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

스택 트레이스 :

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

이 URL을 내가 전화 한 다음과 같습니다 : 여기

내 컨트롤러의 일부입니다 -

localhost:81/api/test/1/books 잘 작동 -

localhost:81/api/Users

나는 또한 오류를 게시하도록하겠습니다 내 구성 클래스 :

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

시작 : 당신은 두 개의 서로 다른 HttpConfiguration를 사용하는

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/사용자")]주는 시도 [권한 부여] 공용 클래스 UsersController : ApiController {...}'와 같은'FindUsersByRole' 경로를 수정'[루트 ("테스트/{역할 ID}/books ")]'그런 다음 url'localhost : 81/api/users/test/1/books'를 사용하여 메소드를 실행하십시오. – Developer

+0

사용중인 패키지를 게시 할 수 있습니까? 'Autofac.WebApi2' 패키지가 있음을 알고 있습니까? –

+0

@ 개발자가 여전히 동일한 오류가 발생합니다 –

답변

1

. GlobalConfiguration에 IIS에서 제공 한 것과 수동으로 만든 것 Startup

그 원인은 그 원인입니다.

코드가 모두 Startup.cs 인 IIS와 OWIN의 충돌로 인해이 코드를 모두 제거하십시오. 이것은 일반적으로 자체 호스팅 OWIN Web API에 대해 수행됩니다.

업데이트 시작 다른

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

모든 것이 이전과 남아 있었다.

+0

그게 전부입니다! 나는 그 복제물을 알아 차리지 못했다. 고마워요! –

관련 문제