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);
}
}
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
Können Sie bitte die Pakete posten, die Sie verwenden. Ist Ihnen bekannt, dass es das Paket 'Autofac.WebApi2' gibt? –
@Developer immer noch den gleichen Fehler –