web-dev-qa-db-fra.com

Ninject.ActivationException levée uniquement sur la première demande Web (WebAPI 2, OWIN 3, Ninject 3)

J'essaie de créer un projet d'API Web "barebones" qui utilise le middleware OWIN, Ninject Depencency Injection, et finalement d'être hébergé dans IIS. J'ai suivi les instructions trouvées dans un article, "Befriending ASP.NET Web.API2, OWIN and Ninject", ici: http://www.alexzaitzev.pro/2014/11/webapi2-owin-and-ninject .html , sauf que j'ai utilisé un projet d'application Web vide et que je n'ai pas coché la case "Inclure les références et les dossiers de l'API Web" lors de la création du projet.

Lorsque j'allume la nouvelle API et que je fais une demande de page, j'obtiens ce qui suit Ninject.ActivationException jeté:

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.

Cette exception disparaît lorsque je rafraîchis mon navigateur. Je ne comprends vraiment pas ce qui cause cette exception. De mon point de vue, étant quelque peu inexpérimenté avec WebAPI dans le contexte OWIN et Ninject, il est difficile de savoir où se situe le problème. Est-ce avec Ninject ...? Est-ce dans OWIN ...? Est-ce dans WebAPI ...?

Voici le contenu de mon fichier 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);
        }
    }
}

Voici le contenu de mon fichier 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>();
        }
    }
}

Voici le contenu de mes 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>

... et, par souci d'exhaustivité, le contenu de mon web.config est tout aussi peu spectaculaire:

<?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>

Quelqu'un peut-il m'indiquer ce que je fais mal ou, plus important encore, ce que je peux changer pour que les choses fonctionnent sans que l'exception soit levée?

29
Jon Pawley

Quelle version de la bibliothèque Ninject.Web.WebApi utilisez-vous? il semble qu'il y a 2 semaines, un changement a été apporté pour déplacer certaines choses. avant cette modification (v3.2.3 et versions antérieures), les liaisons HttpConfiguration étaient présentes dans 2 modules différents dans Ninject.Web.WebApi.OwinHost.OwinWebApiModule et Ninject.Web.WebApi.WebApiModule. après ce changement (la nouvelle version est la 3.2.4), cette liaison ne se produit qu'une seule fois.

61
dave thieben

J'ai eu la même erreur, mais pour une raison différente: pour une raison quelconque, j'avais installé les deux Ninject.Web.WebApi.WebHost et Ninject.Web.WebApi.OwinHost.

Si vous recherchez dans la source OwinWebApiModule.cs et WebApiWebHostModule.cs , les deux modules Ninject ont une liaison pour HttpConfiguration.

J'ai enlevé Ninject.Web.WebApi.WebHost et tout va bien.

16
ngm

Allez dans les références et recherchez Ninject.web.WebApi.WebHost puis supprimez-le. C'est tout ce qui va commencer à fonctionner.

6
Debendra Dash