简单的注入器和路由属性webapi

时间:2015-08-12 15:39:20

标签: asp.net-web-api dependency-injection routes asp.net-web-api2 simple-injector

我有一个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

更新 我使用OWINJWT令牌身份验证,我的项目中有一个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]属性,没有它一切都很好?这对我来说是一个谜。

1 个答案:

答案 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;错误。特别是在使用一个动作调用控制器时可以解析控制器的情况,而在另一个操作期间无法初始化控制器。

请检查以下内容:

  1. 您正在使用上面显示的代码。
  2. 您确定api / New / Register呼叫实际上是通过NewController。您可以在其构造函数和Register方法中设置断点。
  3. 手动调用NewController时,container.GetInstance<NewController>()实际上可以正确解析。