2014-09-05 10 views
11

Ich versuche, einen Windows-Dienst mit OWIN selbst gehosteten WebAPI mit Ninject zu erstellen. Ich habe es zum Laufen gebracht, aber ich musste einen Verweis auf system.web hinzufügen, was falsch scheint. Ohne Bezugnahme auf system.web bekam ich diese Fehler kompilieren:Sollte OWIN Self-Host-App mit Ninject OWINHost System.web verwenden?

Der Typ ‚System.Web.Routing.RouteCollection‘ wird in einer Baugruppe definiert, die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' hinzufügen. Der Typ 'System.Web.Routing.Route' wird in einer Baugruppe definiert, die nicht referenziert ist. Sie müssen einen Verweis auf Assembly 'System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' hinzufügen.

Die Fehler auftauchten, nachdem ich Ninject nach diesem Artikel hinzugefügt Setting up a OWIN WebApi application

Ich musste auch die Microsoft.Owin bis 2.1.0 Version beschränken für Ninject zu arbeiten. Während des Service Startup sucht Ninject nach Owin 2.1.0. Wenn Sie die neueste Version von Microsoft.Owin erhalten, wird es auf 3.0 hochgestuft.

Die drei Haupt NuGet Pakete Ich verwende sind:

Microsoft.AspNet.WebApi.OwinSelfHost

Ninject.Web.Common.OwinHost

Ninject.Web.WebApi.OwinHost

Hier sind alle meine Pakete (man beachte die constrain auf Microsoft.Owin)

<package id="Microsoft.AspNet.WebApi" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.2" targetFramework="net45" /> 
    <package id="Microsoft.Owin" version="2.1.0" targetFramework="net45" allowedVersions="(,2.1]" /> 
    <package id="Microsoft.Owin.Host.HttpListener" version="3.0.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Hosting" version="2.0.2" targetFramework="net45" /> 
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net45" /> 
    <package id="Ninject" version="3.2.2.0" targetFramework="net45" /> 
    <package id="Ninject.Extensions.ContextPreservation" version="3.2.0.0" targetFramework="net45" /> 
    <package id="Ninject.Extensions.NamedScope" version="3.2.0.0" targetFramework="net45" /> 
    <package id="Ninject.Web.Common" version="3.2.2.0" targetFramework="net45" /> 
    <package id="Ninject.Web.Common.OwinHost" version="3.2.2.0" targetFramework="net45" /> 
    <package id="Ninject.Web.WebApi" version="3.2.1.0" targetFramework="net45" /> 
    <package id="Ninject.Web.WebApi.OwinHost" version="3.2.1.0" targetFramework="net45" /> 
    <package id="Owin" version="1.0" targetFramework="net45" /> 

Hier ist, was die Program.cs des Windows-Dienstes wie

sieht
using Microsoft.Owin.Hosting; 
using Ninject; 
using Ninject.Web.Common.OwinHost; 
using Ninject.Web.WebApi.OwinHost; 
using Owin; 
using System.Reflection; 
using System.ServiceProcess; 
using System.Web.Http; 


namespace ServiceExample 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service1() 
      }; 


      using (WebApp.Start<Startup>("http://localhost:12345")) 
      { 
       ServiceBase.Run(ServicesToRun); 
      } 
     } 



     public class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       ConfigureWebAPI(app); 

      } 

      private void ConfigureWebAPI(IAppBuilder app) 
      { 
       var config = new HttpConfiguration(); 
       config.Routes.MapHttpRoute(
        "DefaultApi", 
        "api/{controller}/{id}", 
        new {id = RouteParameter.Optional}); 

       app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(config); 
      } 


      private static StandardKernel CreateKernel() 
      { 
       var kernel = new StandardKernel(); 
       kernel.Load(Assembly.GetExecutingAssembly()); 
       return kernel; 
      } 
     } 
    } 
} 

Antwort

12

Versuchen Sie, System.Web.Http.WebHost.dll aus Referenzen zu entfernen.

references list with System.Web.Http.WebHost.dll


Ich hatte das gleiche Problem, wenn ich ein API-Projekt als Klassenbibliothek und separate Host-Projekte (eines mit Konsole und andere IIS) haben wollte, wie in this great blog post

Das beschriebene Problem war das, als ich ausgeführt Install-Package Microsoft.AspNet.WebApi zu installieren ASP.NET Web API es auch Bezug auf System.Web.Http.WebHost.dll hinzugefügt und das Ergebnis packages.json war:

<packages> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" /> 
</packages> 

so die Lösung Bezug auf System.Web.Http.WebHost.dll und löschen Microsoft.AspNet.WebApi und Microsoft.AspNet.WebApi.WebHost von packages.json, damit es nicht wieder installieren zu entfernen war, wenn einige nuget wiederherstellen tun/neu zu installieren:

<packages> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" /> 
</packages> 

Und das ist mein packages.json aus Arbeitsklassenbibliothek ASP.NET Web API Projekt:

<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.Owin" version="3.0.1" targetFramework="net452" /> 
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" /> 
<package id="Owin" version="1.0" targetFramework="net452" /> 
+0

Ich brauchte diese 3, zusätzlich zu denen, die Sie aufgelistet, um meine Arbeit (.NET 4.5.1) als Windows-Dienst: "Microsoft.AspNet.WebApi.OwinSelfHost" "Microsoft.Owin.Host.HttpListener " " Microsoft.Owin.Hosting " – HungryPipo

+0

Das Hinzufügen von Ninject (eines der NUGet-Pakete) schien die Referenz hinzuzufügen, die das zu brechen scheint! Eine einfache Lösung ist, diese Referenz zu entfernen !! –

+0

Hinzufügen zu obigem: das manuelle Hinzufügen eines Verweises auf system.web scheint auch den Fehler verschwinden zu lassen und geht jetzt mit diesem Ansatz, anstatt den Verweis auf System.Web.Http.WebHost zu entfernen (im Moment ist es nicht ganz klar, ob das so ist) Referenz ist redundant). –

4

ich auf mit dem gleichen Problem, wie Sie kam, aber ohne usign Ninject OwinHost, und ich denke in der Tat, dass das Problem nicht mit ist Ninject aber das Routing.

Das Problem ist dieser Code:

config.Routes.MapHttpRoute(
    "DefaultApi", 
    "api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

die System.Web.Routing verwendet davon auf System.Web Namespace enthalten ist (Check here).

Also, die Alternative zu dieser, die ich gefunden habe, ist das Verwurzeln mit Attributen. So können Sie den Code oben durch diese ersetzen:

// Web API routes 
config.MapHttpAttributeRoutes(); 

Wenn Sie nicht mit ihm vertraut sind, überprüfen this tutorial.

Mit dieser Methode können Sie die System.Web Referenz Ihres Projekts löschen.

+1

Anfangs hatte ich "app.UseWebApi (config)" so der "Routes.MapHttpRoute" -Teil war dort und es löste sich ohne System.Web. Aber mit Ninject wurde System.Web benötigt. Ich brauche Ninject für Abhängigkeitsinjektion, mit der MapHttpAttributesRoutes() Wie starte ich Ninject? – HungryPipo

+2

Dies ist ein guter, praktischer Workaround, aber ich bin ein wenig verwirrt, da _why_ der Aufruf von 'config.Routes.MapHttpRoute' einen Verweis auf' System.Web' benötigt. Keine der Typen, die an dem Aufruf beteiligt sind ('IHttpRoute',' HttpRouteCollection', 'RouteParameter') werden in dieser Assembly deklariert, sie stammen alle aus' System.Web.Http.Routing'. Und die 'System.Web.Http'-Assembly, die 'HttpCollection' enthält, ist nicht von' System.Web' abhängig. Kannst du erklären, wie diese Abhängigkeit entstanden ist? – Peter