C# 尝试将属性路由与autofac一起使用时出现异常
当我试图在我的操作中添加自定义路由属性时,依赖项注入有问题。当我尝试使用标准方法(如Get、Post等)时,一切正常,但当我调用FindUserByRole操作时,我遇到了一个错误: System.InvalidOperationException:尝试创建“UsersController”类型的控制器时出错。确保控制器具有无参数公共构造函数 堆栈跟踪:C# 尝试将属性路由与autofac一起使用时出现异常,c#,asp.net-web-api,autofac,asp.net-web-api-routing,C#,Asp.net Web Api,Autofac,Asp.net Web Api Routing,当我试图在我的操作中添加自定义路由属性时,依赖项注入有问题。当我尝试使用标准方法(如Get、Post等)时,一切正常,但当我调用FindUserByRole操作时,我遇到了一个错误: System.InvalidOperationException:尝试创建“UsersController”类型的控制器时出错。确保控制器具有无参数公共构造函数 堆栈跟踪: at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(Htt
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()
这是我的控制器的一部分:
[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");
}
}
自动传真配置:
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);
}
}
您正在使用两种不同的
HttpConfiguration
。IIS在GlobalConfiguration
中提供给您的,以及您在Startup
这就是你问题的原因
删除Startup.cs
中的所有HttpConfiguration
代码,因为它会导致与IIS和OWIN冲突。这通常是针对自托管OWIN Web Api完成的
更新启动
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
}
}
其他一切都可以像以前一样。尝试给予
[RoutePrefix(“api/Users”)][Authorize]公共类用户控制器:ApiController{…}
并将FindUsersByRole
路由修改为[route(“test/{roleId}/books”)]
然后点击urllocalhost:81/api/users/test/1/books的方法
你能发布你正在使用的软件包吗。您是否知道还有包Autofac.WebApi2
?@Developer仍然得到相同的结果error@ebramkhalil是的,我在用它。我还安装了:Autofac、Autofac MVC5。你想让我把其他的都发出去吗?就像我说的,在我尝试使用自定义路由之前,所有操作都正常工作。似乎Autofac没有进行注入。@MateuszMigała,根据您的尝试,似乎在属性路由之前执行DefaultApi
,就是这样!我没有注意到复制品。谢谢!
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);
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
}
}