Ninject 确保控制器只有在站点重启后才具有带有 Owin 和 Web 的无参数构造函数 Api
Ninject Make sure that the controller has a parameterless constructor with Owin and Web Api only after site restart
我有一个应用程序总是在第一次初始化控制器时失败。它仅在站点在 IIS 中重新启动后发生。从应用程序获得 500 后,我可以重新加载页面,之后一切正常。
无法通过 google 或 SO 找到类似的场景。
我使用了很多 nuget 包,它们是
- Ninject
- Ninject.Web.Common
- Ninject.Web.Common.OwinHost
- Ninject.Web.Common.WebHost
- Ninject.Web.WebApi
- Ninject.Web.WebApi.OwinHost
这是做配置的class
[assembly: OwinStartup(typeof(MyNameSpace.MyClass))]
namespace MyNameSpace
{
internal class MyClass
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
var kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
config.EnsureInitialized();
}
private IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Settings.InjectNonPublic = true;
kernel.Bind<IMyDependency>().To<MyDependency>().InSingletonScope();
// bindings
return kernel;
}
}
}
下面是堆栈跟踪的样子,如果有帮助的话
System.InvalidOperationException: An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor. ---> System.ArgumentException: Type 'MyController' does not have a default constructor
at System.Linq.Expressions.Expression.New(Type type)
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)
--- End of inner exception stack trace ---
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()
什么会导致应用程序第一次失败但随后可以正常工作?任何帮助将不胜感激
编辑:控制器代码看起来像
public class MyController : ApiController
{
private readonly MyDependency _dependency;
internal PathDeviationReportingController(MyDependency dependency)
{
_dependency = dependency;
}
/// <summary>
/// Do Something
/// </summary>
/// <response code="200"></response>
[HttpGet]
[Route("route/dosomething")]
[SwaggerResponse(200)]
public IHttpActionResult DoSomething()
{
return Ok();
}
}
我删除了 Ninject.Common.WebHost,这并没有改变任何东西。还是有问题。
编辑以更新绑定代码的实际外观*
好的,原来是绑定问题。我遇到过这种情况
Bind<IMyDependency>().To<MyDependency>();
并在控制器中
MyController(MyDependency dependency){}
我不确定第一次后它是如何工作的,但这是实际问题。
感谢 nozzleman 指点我
我有一个应用程序总是在第一次初始化控制器时失败。它仅在站点在 IIS 中重新启动后发生。从应用程序获得 500 后,我可以重新加载页面,之后一切正常。
无法通过 google 或 SO 找到类似的场景。
我使用了很多 nuget 包,它们是
- Ninject
- Ninject.Web.Common
- Ninject.Web.Common.OwinHost
- Ninject.Web.Common.WebHost
- Ninject.Web.WebApi
- Ninject.Web.WebApi.OwinHost
这是做配置的class
[assembly: OwinStartup(typeof(MyNameSpace.MyClass))]
namespace MyNameSpace
{
internal class MyClass
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
var kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
config.EnsureInitialized();
}
private IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Settings.InjectNonPublic = true;
kernel.Bind<IMyDependency>().To<MyDependency>().InSingletonScope();
// bindings
return kernel;
}
}
}
下面是堆栈跟踪的样子,如果有帮助的话
System.InvalidOperationException: An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor. ---> System.ArgumentException: Type 'MyController' does not have a default constructor
at System.Linq.Expressions.Expression.New(Type type)
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)
--- End of inner exception stack trace ---
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()
什么会导致应用程序第一次失败但随后可以正常工作?任何帮助将不胜感激
编辑:控制器代码看起来像
public class MyController : ApiController
{
private readonly MyDependency _dependency;
internal PathDeviationReportingController(MyDependency dependency)
{
_dependency = dependency;
}
/// <summary>
/// Do Something
/// </summary>
/// <response code="200"></response>
[HttpGet]
[Route("route/dosomething")]
[SwaggerResponse(200)]
public IHttpActionResult DoSomething()
{
return Ok();
}
}
我删除了 Ninject.Common.WebHost,这并没有改变任何东西。还是有问题。
编辑以更新绑定代码的实际外观*
好的,原来是绑定问题。我遇到过这种情况
Bind<IMyDependency>().To<MyDependency>();
并在控制器中
MyController(MyDependency dependency){}
我不确定第一次后它是如何工作的,但这是实际问题。
感谢 nozzleman 指点我