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;
}
}
}
}
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
L'aggiunta di Ninject (uno dei pacchetti NUGet) sembrava aggiungere il riferimento che sembra interrompere questo! La soluzione semplice è rimuovere quel riferimento !! –
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). –