2014-09-05 9 views
11

Sto provando a creare un servizio Windows con WebAPI OWIN ospitato con Ninject. Ho avuto modo di funzionare, ma ho dovuto aggiungere un riferimento a system.web, che sembra sbagliato. Senza un riferimento system.web Ho questi errori di compilazione:L'app host OWIN che utilizza Ninject OWINHost deve avere system.web?

Il tipo 'System.Web.Routing.RouteCollection' è definito in un assembly che non viene fatto riferimento. È necessario aggiungere un riferimento all'assieme 'System.Web, Versione = 4.0.0.0, Cultura = neutra, PublicKeyToken = b03f5f7f11d50a3a'.

Il tipo 'System.Web.Routing.Route' è definito in un assieme che è non referenziato. È necessario aggiungere un riferimento all'assembly 'System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'.

Gli errori si presentò dopo ho aggiunto Ninject secondo questo articolo Setting up a OWIN WebApi application

ho dovuto anche per vincolare la Microsoft.Owin alla versione 2.1.0 per Ninject al lavoro. Durante l'avvio del servizio, Ninject sta cercando Owin 2.1.0. Se si ottiene l'ultima versione di Microsoft.Owin, verrà portato a 3.0.

Le tre principali pacchetti Nuget che sto usando sono:

Microsoft.AspNet.WebApi.OwinSelfHost

Ninject.Web.Common.OwinHost

Ninject.Web.WebApi.OwinHost

Ecco tutti i miei pacchetti (si noti il ​​vincolo sulla 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" /> 

Ecco cosa Program.cs del servizio Windows sembra

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

risposta

12

Provare a rimuovere System.Web.Http.WebHost.dll dai riferimenti.

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


Ho avuto lo stesso problema quando ho voluto avere un progetto API come libreria di classi e progetti d'accoglienza separati (uno con console e altri IIS), come descritto nella this great blog post

Il problema è che quando eseguivo Install-Package Microsoft.AspNet.WebApi per installare API Web ASP.NET anche aggiunto riferimento a System.Web.Http.WebHost.dll e il risultato packages.json era:

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

quindi la soluzione era quella di rimuovere il riferimento alla System.Web.Http.WebHost.dll ed eliminare Microsoft.AspNet.WebApi e Microsoft.AspNet.WebApi.WebHost da packages.json in modo da non installare di nuovo quando alcuni faranno NuGet ripristinare/reinstallare:

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

E questo è il mio packages.json da lavorando libreria di classi ASP.NET Web API progetto:

<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

Avevo bisogno di questi 3, oltre a quelli che hai elencato, per far funzionare la mia (.NET 4.5.1) come servizio Windows: "Microsoft.AspNet.WebApi.OwinSelfHost" "Microsoft.Owin.Host.HttpListener " " Microsoft.Owin.Hosting " – HungryPipo

+0

L'aggiunta di Ninject (uno dei pacchetti NUGet) sembrava aggiungere il riferimento che sembra interrompere questo! La soluzione semplice è rimuovere quel riferimento !! –

+0

Aggiungendo a quanto sopra: aggiungendo manualmente riferimento a system.web sembra anche far scomparire l'errore e attualmente seguire questo approccio invece di rimuovere il riferimento a System.Web.Http.WebHost (al momento non è del tutto chiaro se quello il riferimento è ridondante). –

4

mi sono imbattuto con lo stesso problema come voi, ma senza usign Ninject OwinHost, e anzi credo che il problema non è con Ninject ma il routing.

Il problema è questo codice:

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

che utilizza System.Web.Routing Wich è contenuta in System.Web namespace (Check here).

Quindi, l'alternativa a ciò che ho trovato è utilizzare il rooting con attributi. Così si può sostituire il codice precedente da questo:

// Web API routes 
config.MapHttpAttributeRoutes(); 

Se non si ha familiarità con esso, controllare this tutorial.

Utilizzando questo approccio è possibile eliminare il riferimento System.Web del proprio progetto.

+1

Inizialmente ho avuto "app.UseWebApi (config)" in modo la parte "Routes.MapHttpRoute" era lì e si è risolta senza System.Web. Ma aggiungendo Ninject, era richiesto System.Web. Ho bisogno di Ninject per l'iniezione delle dipendenze, con MapHttpAttributesRoutes() come faccio ad avviare Ninject? – HungryPipo

+2

Questa è una buona soluzione pratica, ma sono un po 'confuso sul fatto che _why_ la chiamata a 'config.Routes.MapHttpRoute' richiede un riferimento a' System.Web'. Nessuno dei tipi coinvolti nella chiamata ('IHttpRoute',' HttpRouteCollection', 'RouteParameter') sono dichiarati in quell'assembly, sono tutti provenienti da' System.Web.Http.Routing'. E l'assembly 'System.Web.Http' contenente' HttpCollection' non dipende da 'System.Web'. Puoi spiegare come è sorta questa dipendenza? – Peter

Problemi correlati