可能的OWIN启动和Ninject并发请求问题?

时间:2016-04-19 09:27:40

标签: .net asp.net-web-api ninject owin

我创建了ASP.NET WebAPI .NET framework 4.5。 Ninject 3.2.00 MicroSoft.OWIN 3.0.10

部署到IIS-7的API

我们的OWIN启动类看起来像这样:

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进行了两次同时调用,则两个同时调用中的一个会在大约一秒钟后出现错误而另一个在启动3秒后成功。所有后续呼叫都成功,并行或按顺序进行。

在回收AppPool后发出单个请求时,不会发生此问题

Stacktrace:

{
"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依赖项时这是否是某种并发问题。任何人都可以帮助我们解决问题,或者我们的Startup类是否有问题?

1 个答案:

答案 0 :(得分:1)

我使用上面提到的代码修复了类似的问题 https://stackoverflow.com/a/35048937

IKernel kernel = CreateKernel();

app.UseNinjectMiddleware(() => kernel)
            .UseNinjectWebApi(config);

您可以在NinjectConfig.Register()

中尝试上述代码