Asp.net web api 仅在第一个web请求时引发Ninject.ActivationException(WebAPI 2、OWIN 3、Ninject 3)

Asp.net web api 仅在第一个web请求时引发Ninject.ActivationException(WebAPI 2、OWIN 3、Ninject 3),asp.net-web-api,ninject,owin,Asp.net Web Api,Ninject,Owin,我试图创建一个“基本”的Web API项目,它使用OWIN中间件、Ninject依赖注入,并最终托管在IIS中。我遵循了一篇文章“Befriending ASP.NET Web.API2,OWIN and Ninject”中的说明,但我使用了一个空的Web应用程序项目,并且在创建项目时没有勾选“包含Web API引用和文件夹” 当我启动新API并发出页面请求时,会抛出以下Ninject.ActivationException: 当我刷新浏览器时,此异常消失。我真的不明白是什么导致了这个异常。在我

我试图创建一个“基本”的Web API项目,它使用OWIN中间件、Ninject依赖注入,并最终托管在IIS中。我遵循了一篇文章“Befriending ASP.NET Web.API2,OWIN and Ninject”中的说明,但我使用了一个空的Web应用程序项目,并且在创建项目时没有勾选“包含Web API引用和文件夹”

当我启动新API并发出页面请求时,会抛出以下
Ninject.ActivationException

当我刷新浏览器时,此异常消失。我真的不明白是什么导致了这个异常。在我看来,由于对OWIN上下文和Ninject中的WebAPI缺乏经验,很难知道问题所在。是不是和Ninject。。。?是在奥文。。。?它在WebAPI中吗

这是my Startup.cs文件的内容:

using System.Web.Http;
using LHD.API_2;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Ninject.Web.Common.OwinHost;
using Ninject.Web.WebApi.OwinHost;
using Owin;

[assembly: OwinStartup(typeof(Startup))]

namespace LHD.API_2
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute("API Default", "api/1/{controller}/{action}/{id}", new { id = RouteParameter.Optional });

            app.UseNinjectMiddleware(() => NinjectConfig.CreateKernel.Value);
            app.UseNinjectWebApi(config);
        }
    }
}
这是我的NinjectConfig.cs文件的内容:

using System;
using System.Reflection;
using Ninject;

namespace LHD.API_2
{
    public static class NinjectConfig
    {
        public static Lazy<IKernel> CreateKernel = new Lazy<IKernel>(() =>
        {
            StandardKernel kernel = new StandardKernel();
            kernel.Load(Assembly.GetExecutingAssembly());

            RegisterServices(kernel);

            return kernel;
        });

        private static void RegisterServices(KernelBase kernel)
        {
            // TODO - put in registrations here...

            //kernel.Bind<IFakeService>().To<FakeService>();
        }
    }
}
使用系统;
运用系统反思;
使用Ninject;
名称空间LHD.API_2
{
公共静态类NinjectConfig
{
publicstaticlazycreatekernel=newlazy(()=>
{
StandardKernel内核=新的StandardKernel();
Load(Assembly.getExecutionGassembly());
注册服务(内核);
返回内核;
});
私有静态void注册表服务(KernelBase内核)
{
//待办事项-在这里注册。。。
//kernel.Bind().To();
}
}
}
这是mypackages.config的内容:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net451" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net451" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net451" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net451" />
  <package id="Ninject" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Extensions.ContextPreservation" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Extensions.NamedScope" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Web.Common.OwinHost" version="3.2.3.0" targetFramework="net451" />
  <package id="Ninject.Web.WebApi" version="3.2.0.0" targetFramework="net451" />
  <package id="Ninject.Web.WebApi.OwinHost" version="3.2.4.0" targetFramework="net451" />
  <package id="Owin" version="1.0" targetFramework="net451" />
</packages>

。。。而且,为了完整起见,my web.config的内容也同样不引人注目:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5.1" />
        <httpRuntime targetFramework="4.5.1" />
    </system.web>

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Http.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>


有人能告诉我我做错了什么,或者更重要的是,我能做些什么来让事情正常运行而不引发异常吗?

您使用的是哪个版本的Ninject.Web.WebApi库?看起来两周前,一些东西被改变了。在此更改之前(v3.2.3及更早版本),
HttpConfiguration
绑定出现在
Ninject.Web.WebApi.OwinHost.owinwebapimule
Ninject.Web.WebApi.webapimule
中的两个不同模块中。在这次更改(新版本是3.2.4)之后,此绑定只发生一次。

我有相同的错误,但原因不同:出于某种原因,我安装了
Ninject.Web.WebApi.WebHost
Ninject.Web.WebApi.OwinHost

如果在源代码中查找and,两个Ninject模块都有一个用于
HttpConfiguration
的绑定


我删除了
Ninject.Web.WebApi.WebHost
,一切正常。

转到参考资料,搜索Ninject.Web.WebApi.WebHost,然后删除它。这就是它将开始工作的全部内容。

谢谢@dave thieben。更新到最新的Ninject软件包确实解决了我的问题。我安装了
Ninject.Web.WebApi.WebHost的Nuget软件包版本3.2.4。它安装了对
Ninject.Web.WebApi`的依赖项,但使用了3.2.0版。升级到最新版本(3.2.4)修复了我的问题我们有这个问题,但不确定如何解决它,因为我们需要一个owin启动用于自托管,需要一个用于IIS通用的webhost,每当我们通过owinhost使用ninject时,它会在第一个请求时爆炸,如前所述,但由于我们在应用程序中需要两个DLL,有解决方法吗?(我们确实尝试将自己的主机放在其他地方,但除非它是一个控制台或web应用程序,否则它不会工作,因为找不到启动,所以我们只是将它移回webapi项目中,在那里它的配置仍然存在。
<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5.1" />
        <httpRuntime targetFramework="4.5.1" />
    </system.web>

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Http.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>