【问题标题】:Possible OWIN Startup and Ninject concurrent request issue ?可能的 OWIN 启动和 Ninject 并发请求问题?
【发布时间】:2016-08-11 09:14:59
【问题描述】:

我已经创建了 ASP.NET WebAPI .NET 框架 4.5。 忍者 3.2.00 微软.OWIN 3.0.10

API 部署到 IIS-7

我们的 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后单次请求不会出现该问题

堆栈跟踪:

{
"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 类是否有问题?

【问题讨论】:

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


    【解决方案1】:

    我使用提到的代码解决了一个类似的问题 https://stackoverflow.com/a/35048937

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

    你可以在你的 NinjectConfig.Register() 中试试上面的代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-18
      • 2014-08-13
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多