可能的 OWIN 启动和 Ninject 并发请求问题?
Possible OWIN Startup and Ninject concurrent request issue ?
我创建了 ASP.NET 网站API
.NET 框架 4.5。
Ninject 3.2.00
MicroSoft.OWIN3.0.10
API 部署到 IIS-7
我们的 OWIN 启动 class 看起来像这样:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = GlobalConfiguration.Configuration;
WebApiConfig.Register(config);
NinjectConfig.Register(app, config);
}
}
和NinjectConfig.cs长得像
public class NinjectConfig
{
public static void Register(IAppBuilder app, HttpConfiguration config)
{
app.UseNinjectMiddleware(CreateKernel)
.UseNinjectWebApi(config);
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load("XYZ.*.dll");
return kernel;
}
}
遇到以下错误...
如果在 AppPool 刷新后对 api 进行了至少两次同时调用,则这两次同时调用中的一个会在大约 1 秒后失败并出现错误,而另一个会在启动 3 秒后成功。所有后续调用都成功,并行或顺序。
回收AppPool后单次请求不会出现该问题
堆栈跟踪:
{
"Message":"An error has occurred.",
"ExceptionMessage":"An error occurred when trying to create a controller of type 'TestController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":" at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException":{
"Message":"An error has occurred.",
"ExceptionMessage":"Type 'Test.XYZ.Api.Controllers.TestController' does not have a default constructor",
"ExceptionType":"System.ArgumentException",
"StackTrace":" at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request,
Type controllerType,
Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)"
}
我们想知道这是否是加载 Ninject 依赖项时的某种并发问题。任何人都可以帮助我们解决问题,或者如果我们的启动有问题 class ?
我使用提到的代码修复了一个类似的问题
IKernel kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel)
.UseNinjectWebApi(config);
您可以在 NinjectConfig.Register()
中尝试上面的代码
我创建了 ASP.NET 网站API .NET 框架 4.5。 Ninject 3.2.00 MicroSoft.OWIN3.0.10
API 部署到 IIS-7
我们的 OWIN 启动 class 看起来像这样:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = GlobalConfiguration.Configuration;
WebApiConfig.Register(config);
NinjectConfig.Register(app, config);
}
}
和NinjectConfig.cs长得像
public class NinjectConfig
{
public static void Register(IAppBuilder app, HttpConfiguration config)
{
app.UseNinjectMiddleware(CreateKernel)
.UseNinjectWebApi(config);
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load("XYZ.*.dll");
return kernel;
}
}
遇到以下错误...
如果在 AppPool 刷新后对 api 进行了至少两次同时调用,则这两次同时调用中的一个会在大约 1 秒后失败并出现错误,而另一个会在启动 3 秒后成功。所有后续调用都成功,并行或顺序。
回收AppPool后单次请求不会出现该问题
堆栈跟踪:
{
"Message":"An error has occurred.",
"ExceptionMessage":"An error occurred when trying to create a controller of type 'TestController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":" at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException":{
"Message":"An error has occurred.",
"ExceptionMessage":"Type 'Test.XYZ.Api.Controllers.TestController' does not have a default constructor",
"ExceptionType":"System.ArgumentException",
"StackTrace":" at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request,
Type controllerType,
Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)"
}
我们想知道这是否是加载 Ninject 依赖项时的某种并发问题。任何人都可以帮助我们解决问题,或者如果我们的启动有问题 class ?
我使用提到的代码修复了一个类似的问题
IKernel kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel)
.UseNinjectWebApi(config);
您可以在 NinjectConfig.Register()
中尝试上面的代码