我有一个WebApi 2应用程序,我使用简单的注射器,一切正常。
但今天我尝试使用[RoutePrefix]和[Route]属性来解析我在特定控制器上的路由,似乎简单的注入器无法创建我的控制器的实例。
我收到此错误
尝试创建类型的控制器时发生错误 ' NewController&#39 ;.确保控制器具有无参数 公共建设者。类型 ' Public.API.Controllers.NewController'没有默认值 构造
堆栈追踪:
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()
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]
[RoutePrefix("api/New")]
public class NewController : ApiController
{
private IUserService userService;
public NewController(IUserService userService)
{
this.userService = userService;
}
[HttpPost]
[AllowAnonymous]
public async Task<IHttpActionResult> Register(ApiRegisterUserRequestModel model) {
return Content(HttpStatusCode.OK, "reponse");
}
[HttpPost]
[AllowAnonymous]
[Route("ForgotPasswordSendEmail")]
public async Task<IHttpActionResult> ForgotPasswordSendEmail(
[FromBody] ApiForgotPasswordRequestModel model)
{
var response = "cool";
return Content(HttpStatusCode.OK, response);
}
}
如果我向Register
操作发出请求,我会收到回复,但如果我向ForgotPasswordSendEmail
操作发出请求,则会收到我上面提到的错误。
我的简单进样器配置是这里提到的基本设置
https://simpleinjector.readthedocs.org/en/latest/webapiintegration.html
更新
我使用OWIN
和JWT
令牌身份验证,我的项目中有一个global.asax
和一个startup
文件,两者都配置为使用webapi。
这些是我的Startup
课程和Application_Start
//startup class
public class Startup
{
public void Configuration(IAppBuilder app)
{
SimpleInjectorWebApiInitializer.Initialize();
HttpConfiguration httpConfig = new HttpConfiguration();
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
WebApiConfig.Register(httpConfig);
app.UseWebApi(httpConfig);
}
}
//Application_Start
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
SimpleInjector.Configure();
SimpleInjectorWebApiInitializer.Initialize();
}
我从startup
删除了所有api配置,如果是这样的话,我就离开了
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
}
}
它开始起作用了。
现在,为什么它没有使用[Route]
属性,没有它一切都很好?这对我来说是一个谜。
答案 0 :(得分:0)
我一直试图重现这个问题,但没有成功。您通常会得到&#34;确保控制器具有无参数的公共构造函数&#34;注册的IDependencyResolver.GetService
返回null并且请求的类型没有默认构造函数时出错。
如果您按照Simple Injector's configuration guidance进行操作,SimpleInjectorWebApiDependencyResolver
将不会返回null
,但会返回有效的控制器实例 - 或者 - 会抛出一个富有表现力的异常。默认指南指出您至少执行以下操作:
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
如果你使用这个代码,你就不太可能得到这个&#34;确保控制器有一个无参数的公共构造函数&#34;错误。特别是在使用一个动作调用控制器时可以解析控制器的情况,而在另一个操作期间无法初始化控制器。
请检查以下内容:
NewController
。您可以在其构造函数和Register
方法中设置断点。NewController
时,container.GetInstance<NewController>()
实际上可以正确解析。