可能的 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()

中尝试上面的代码