2015-02-25 12 views
27

Ich bin versucht, eine "Barebones" Web-API-Projekt zu erstellen, die OWIN Middleware, Ninject Depencency Injection verwendet und schließlich in IIS gehostet werden . Ich habe Anweisungen in einem Artikel, „Befriending ASP.NET Web.API2, OWIN und Ninject,“ hier gefolgt: http://www.alexzaitzev.pro/2014/11/webapi2-owin-and-ninject.html, außer ich ein leeres Web Application Project verwendet, und nicht kreuzte die „Web-API-Referenzen und Ordner einbeziehen“, wenn Erstellen des Projekts.nur auf den ersten Web-Anfrage (WebAPI 2, OWIN 3, Ninject 3) Ninject.ActivationException geworfen

Wenn ich die neue API anwerfen und eine Seitenanforderung machen, erhalte ich die folgende Ninject.ActivationException geworfen:

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. 

Diese Ausnahme geht weg, wenn ich meinen Browser aktualisieren. Ich verstehe wirklich nicht, was diese Ausnahme verursacht. Aus meiner Sicht etwas unerfahren mit WebAPI in OWIN Kontext und Ninject zu sein, ist es schwer zu wissen, wo das Problem liegt. Ist es mit Ninject ...? Ist es in OWIN ...? Ist es in WebAPI ...?

Dies ist der Inhalt meiner Startup.cs Datei:

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

Dies ist der Inhalt meiner NinjectConfig.cs Datei:

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

Dies ist der Inhalt meiner Pakete .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> 

... und, aus Gründen der Vollständigkeit, ist der Inhalt meiner web.config ähnlich unspektakulär:

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

jemand auf mich zeigen kann, was ich falsch mache, oder was noch wichtiger ist, was ich ändern kann Dinge funktionieren zu lassen, ohne dass die Ausnahme ausgelöst wird?

Antwort

59

Welche Version der Ninject.Web.WebApi Bibliothek verwenden Sie? Es sieht so aus, als ob vor 2 Wochen eine Änderung vorgenommen wurde, um einige Dinge herum zu bewegen. vor dieser Änderung (V3.2.3 und früher), waren HttpConfiguration Bindungen in 2 verschiedenen Module in Ninject.Web.WebApi.OwinHost.OwinWebApiModule und Ninject.Web.WebApi.WebApiModule. nach dieser Änderung (neue Version ist 3.2.4) erfolgt diese Bindung nur einmal.

+2

Thanks @ dave-Thieben. Die Aktualisierung auf die neuesten Ninject-Pakete hat meine Probleme gelöst. –

+26

Ich habe das "Ninject.Web.WebApi.WebHost" Nuget Paket Version 3.2.4 installiert. Dies installiert die Abhängigkeit von 'Ninject.Web.WebApi' aber verwendete Version 3.2.0. Aktualisierung auf den neuesten (3.2.4) reparierte es für mich – Colin

14

Ich hatte den gleichen Fehler, aber aus einem anderen Grund: Aus irgendeinem Grund hatte ich sowohl Ninject.Web.WebApi.WebHost und Ninject.Web.WebApi.OwinHost installiert.

Wenn Sie in Quelle sucht OwinWebApiModule.cs und WebApiWebHostModule.cs, beide Ninject Module für HttpConfiguration eine Bindung.

I entfernt Ninject.Web.WebApi.WebHost und alles ist gut.

+1

Dies ist die richtige Antwort. – starmandeluxe

+0

Wir haben dieses Problem, aber nicht sicher, wie wir es lösen können, da wir einen owin Start für Selbsthosting und einen Webhost für IIS allgemeine Verwendung benötigen, wann immer wir ninject über owinhost verwenden, explodiert es bei der ersten Anfrage wie erwähnt, aber da wir beides brauchen DLLs in der Anwendung gibt es eine Problemumgehung? (Wir haben versucht, unseren Selbsthost anderswo zu platzieren, aber wenn es keine Konsole oder Webapp war, hat es nicht funktioniert, weil der Start nicht gefunden wurde, also haben wir es einfach zurück in das Webapi-Projekt verschoben, wo die Konfiguration sowieso war. – Grofit

5

Gehen Sie zur referances und die Suche nach Ninject.web.WebApi.WebHost und entfernen Sie dann this.Thats alle wird es anfangen zu arbeiten.