【问题标题】:Ninject.ActivationException thrown only on first web request (WebAPI 2, OWIN 3, Ninject 3)Ninject.ActivationException 仅在第一个 Web 请求时引发(WebAPI 2、OWIN 3、Ninject 3)
【发布时间】:2016-11-25 04:05:09
【问题描述】:

我正在尝试创建一个“准系统”Web API 项目,该项目使用 OWIN 中间件、Ninject 依赖注入,并最终托管在 IIS 中。我已按照文章“与 ASP.NET Web.API2、OWIN 和 Ninject 交朋友”中的说明进行操作:http://www.alexzaitzev.pro/2014/11/webapi2-owin-and-ninject.html,但我使用了一个空的 Web 应用程序项目,并且没有勾选“包括 Web API 引用和文件夹” " 创建项目时。

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

Server Error in '/' Application.

Error activating HttpConfiguration
More than one matching bindings are available.
Matching bindings:
 1) binding from HttpConfiguration to method
 2) binding from HttpConfiguration to constant value
Activation path:
 1) Request for HttpConfiguration

Suggestions:
 1) Ensure that you have defined a binding for HttpConfiguration only once.

刷新浏览器后,此异常消失。我真的不明白是什么导致了这个异常。从我的角度来看,在 OWIN 上下文和 Ninject 中对 WebAPI 有点缺乏经验,很难知道问题出在哪里。是与Ninject...吗?是在 OWIN 中吗...?是在 WebAPI 中吗...?

这是我的 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>();
        }
    }
}

这是我的 packages.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>

...而且,为了完整起见,我的 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>

谁能指出我做错了什么,或者更重要的是,我可以改变什么来让事情正常工作而不会引发异常?

【问题讨论】:

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


    【解决方案1】:

    您使用的是哪个版本的 Ninject.Web.WebApi 库?看起来 2 周前进行了更改以移动一些东西。在此更改之前(v3.2.3 和更早版本),HttpConfiguration 绑定存在于Ninject.Web.WebApi.OwinHost.OwinWebApiModuleNinject.Web.WebApi.WebApiModule 的两个不同模块中。在此更改后(新版本为 3.2.4),此绑定仅发生一次。

    【讨论】:

    • 谢谢@dave-thieben。更新到最新的 Ninject 包确实解决了我的问题。
    • 我安装了Ninject.Web.WebApi.WebHost' Nuget package version 3.2.4. This installed the dependency on Ninject.Web.WebApi`,但使用的是3.2.0版本。升级到最新的(3.2.4)为我修复了它
    【解决方案2】:

    我遇到了同样的错误,但出于不同的原因:出于某种原因,我同时安装了 Ninject.Web.WebApi.WebHostNinject.Web.WebApi.OwinHost

    如果您在源代码中查找OwinWebApiModule.csWebApiWebHostModule.cs,则两个Ninject 模块都有HttpConfiguration 的绑定。

    我删除了Ninject.Web.WebApi.WebHost,一切都很好。

    【讨论】:

    • 我们有这个问题,但不知道如何解决它,因为我们需要一个用于自托管的 o​​win 启动和一个用于 IIS 一般用途的 webhost,每当我们通过 owinhost 使用 ninject 时,它会在第一个请求时爆炸为提到了,但是由于我们在应用程序中需要两个 dll,是否有解决方法? (我们确实尝试将自己的主机放在其他地方,但除非它是控制台或 Web 应用程序,否则由于找不到启动,它无法工作,所以我们只是将它移回 webapi 项目,无论如何它的配置。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 2017-10-15
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多