2015-02-25 20 views
27

Sto tentando di creare un progetto API Web "barebone" che utilizza il middleware OWIN, Ninject Depencency Injection e, infine, deve essere ospitato in IIS . Ho seguito le istruzioni trovate in un articolo, "Befriending ASP.NET Web.API2, OWIN e Ninject," qui: http://www.alexzaitzev.pro/2014/11/webapi2-owin-and-ninject.html, tranne che ho utilizzato un progetto di applicazione Web vuoto e non contrassegnato "Includi riferimenti e cartelle API Web" quando creando il progetto.Ninject.ActivationException generata solo sulla prima richiesta Web (WebAPI 2, OWIN 3, Ninject 3)

Quando ho accendere la nuova API e fare una richiesta di pagina, ottengo il seguente Ninject.ActivationException gettato:

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. 

Questa eccezione va via quando rinfresco il mio browser. Io davvero non capisco cosa stia causando questa eccezione. Dal mio punto di vista, essendo un po 'inesperto di WebAPI nel contesto di OWIN e di Ninject, è difficile sapere dove si trova il problema. È con Ninject ...? È in OWIN ...? È in WebAPI ...?

Questo è il contenuto del mio file 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); 
     } 
    } 
} 

Questo è il contenuto dei miei NinjectConfig.cs di file:

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>(); 
     } 
    } 
} 

Questo è il contenuto delle mie pacchetti .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> 

... e, per ragioni di completezza, il contenuto del mio web.config è simile spettacolare:

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

Qualcuno mi può puntare verso quello che sto facendo male, o più importante, quello che posso cambiare far funzionare le cose senza che venga lanciata l'eccezione?

risposta

59

Quale versione della libreria Ninject.Web.WebApi stai utilizzando? sembra che 2 settimane fa sia stato fatto un cambiamento per spostare alcune cose. prima di questa modifica (v3.2.3 e precedenti), i binding HttpConfiguration erano presenti in 2 moduli diversi in Ninject.Web.WebApi.OwinHost.OwinWebApiModule e Ninject.Web.WebApi.WebApiModule. dopo questa modifica (la nuova versione è la 3.2.4), questa associazione si verifica solo una volta.

+2

Grazie @ dave-thieben. L'aggiornamento agli ultimi pacchetti di Ninject ha effettivamente risolto i miei problemi. –

+26

Ho installato la versione del pacchetto Nuget di 'Ninject.Web.WebApi.WebHost '3.2.4. Questo ha installato la dipendenza su 'Ninject.Web.WebApi' ma ha usato la versione 3.2.0. Aggiornamento all'ultimo (3.2.4) risolto per me – Colin

14

Ho avuto lo stesso errore, ma per un motivo diverso: per qualche motivo avevo installato sia Ninject.Web.WebApi.WebHost e Ninject.Web.WebApi.OwinHost.

Se si cerca in origine per OwinWebApiModule.cs e WebApiWebHostModule.cs, entrambi i moduli Ninject hanno un binding per HttpConfiguration.

Ho rimosso Ninject.Web.WebApi.WebHost e tutto va bene.

+1

Questa è la risposta corretta. – starmandeluxe

+0

Abbiamo questo problema ma non sappiamo come risolverlo poiché abbiamo bisogno di una startup owin per l'auto hosting e un webhost per l'utilizzo generale di IIS, ogni volta che usiamo ninject via owinhost esplode alla prima richiesta come accennato, ma poiché abbiamo bisogno di entrambi DLL nell'applicazione c'è una soluzione? (Abbiamo provato a mettere il nostro self host altrove, ma a meno che non si trattasse di una console o di un'app web non funzionava perché non è stata trovata la startup, quindi l'abbiamo spostata nuovamente nel progetto webapi in cui la configurazione era comunque. – Grofit

5

Passare a Referances e cercare Ninject.web.WebApi.WebHost e quindi rimuovere questo.Questo funziona.