web-dev-qa-db-ja.com

Ninject.ActivationExceptionは最初のWeb要求でのみスローされます(WebAPI 2、OWIN 3、Ninject 3)

OWINミドルウェアであるNinject Depencency Injectionを使用し、最終的にIISでホストされる「barebones」Web APIプロジェクトを作成しようとしています。ここでは、記事「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);
        }
    }
}

これはmyNinjectConfig.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>();
        }
    }
}

これは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>

...そして、完全を期すために、私の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>

誰かが私が間違っていること、またはもっと重要なこととして、例外をスローせずに物事を動作させるために変更できることを教えてもらえますか?

29
Jon Pawley

Ninject.Web.WebApiライブラリのどのバージョンを使用していますか? 2週間前に何かを移動するために変更が行われたようです。この変更の前(v3.2.3以前)、HttpConfigurationバインディングは、Ninject.Web.WebApi.OwinHost.OwinWebApiModuleおよびNinject.Web.WebApi.WebApiModuleの2つの異なるモジュールに存在していました。この変更後(新しいバージョンは3.2.4)、このバインドは1回のみ発生します。

61
dave thieben

同じエラーが発生しましたが、別の理由で、何らかの理由で両方をインストールしましたNinject.Web.WebApi.WebHostおよびNinject.Web.WebApi.OwinHost

ソースで OwinWebApiModule.cs および WebApiWebHostModule.cs を検索すると、両方のNinjectモジュールにHttpConfigurationのバインディングがあります。

私は削除しました Ninject.Web.WebApi.WebHostそしてすべてが順調です。

16
ngm

Referencesに移動し、Ninject.web.WebApi.WebHostを検索してからthis.Thatsを削除します。

6
Debendra Dash