【发布时间】: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,根据您的尝试,似乎
DefaultApi在Attribute Routing之前执行
标签: c# asp.net-web-api autofac asp.net-web-api-routing