2017-01-03 2 views
2

Ich habe ein Problem mit Abhängigkeitsinjektion, wenn ich versuche, benutzerdefinierte Routenattribute für meine Aktion hinzuzufügen. Alles funktioniert gut, wenn ich versuche, Standardverfahren zu verwenden, wie Get, Post usw., aber wenn ich rufe FindUsersByRole Aktion Ich erhalte eine Fehlermeldung:Ausnahme, die versucht, Attributrouting mit Autofac zu verwenden

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

Stapelüberwachung:

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

innere Ausnahme:

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) 

Hier ist ein Teil meiner Controller:

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

Hier sind die Urls Ich rufe:

localhost:81/api/Users - adaequat

localhost:81/api/test/1/books - Fehler

ich auch bin Entsendung meine Konfig-Klassen:

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

Startup:

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

Versuchen geben '[RoutePrefix ("api/Users")] [autorisieren] public class Userscontroller: die' FindUsersByRole' Route als '[Weg (" test/{} RoleID ApiController {...} 'und ändern/books ")]' und dann drücken Sie die Methode mit der URL 'localhost: 81/api/users/test/1/books' – Developer

+0

Können Sie bitte die Pakete posten, die Sie verwenden. Ist Ihnen bekannt, dass es das Paket 'Autofac.WebApi2' gibt? –

+0

@Developer immer noch den gleichen Fehler –

Antwort

1

Sie zwei verschiedene HttpConfiguration verwenden. Die von IIS in GlobalConfiguration zur Verfügung gestellte und die, die Sie in Startup

manuell erstellt haben Das ist die Ursache für Ihr Problem.

Entfernen Sie alle HttpConfiguration Code in Startup.cs, da es Konflikte mit IIS und OWIN verursacht. Dies wird normalerweise für selbst gehostete OWIN Web API getan.

aktualisiert Startup

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

alles andere könnte nach wie vor bleiben.

+0

Das war es! Ich habe die Vervielfältigung nicht bemerkt. Danke vielmals! –

Verwandte Themen