Должно ли OWIN-приложение для самостоятельного хостинга использовать Ninject OWINHost, необходимо system.web?

Я пытаюсь создать службу Windows с автономным WebAPI OWIN с Ninject. Я получил его для работы, но мне пришлось добавить ссылку на system.web, что кажется неправильным. Без ссылки на system.web я получил эти ошибки компиляции:

Тип "System.Web.Routing.RouteCollection" определен в сборку, на которую не ссылаются. Вы должны добавить ссылку на сборку 'System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a ".

Тип" System.Web.Routing.Route "определен в сборке, которая не упоминается. Вы должны добавить ссылку на сборку" System.Web", Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a '.

Ошибки появились после того, как я добавил Ninject в соответствии с этой статьей Настройка приложения OWIN WebApi

Мне также пришлось сдерживать Microsoft.Owin до версии 2.1.0 для работы Ninject. Во время запуска сервиса Ninject ищет Owin 2.1.0. Если вы получите последнюю версию на Microsoft.Owin, он перейдет в 3.0.

Три основных пакета NuGet, которые я использую:

Microsoft.AspNet.WebApi.OwinSelfHost

Ninject.Web.Common.OwinHost

Ninject.Web.WebApi.OwinHost

Здесь все мои пакеты (обратите внимание на ограничение на 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" />

Здесь программа Program.cs службы Windows выглядит как

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

Ответ 1

Попробуйте удалить System.Web.Http.WebHost.dll из ссылок.

список ссылок с System.Web.Http.WebHost.dll


У меня была такая же проблема, когда я хотел иметь проект API как библиотеку классов и отдельные хост-проекты (один с консолью и другим IIS), как описано в this отличная статья в блоге

Проблема заключалась в том, что когда я выполнил Install-Package Microsoft.AspNet.WebApi для установки ASP.NET Web API, он также добавил ссылку на System.Web.Http.WebHost.dll, а результат packages.json был:

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

поэтому решение заключалось в том, чтобы удалить ссылку на System.Web.Http.WebHost.dll и удалить Microsoft.AspNet.WebApi и Microsoft.AspNet.WebApi.WebHost из packages.json, чтобы он не устанавливался снова, когда некоторые из них будут выполнять восстановление/переустановку nuget:

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

И это мой packages.json из библиотеки рабочего класса ASP.NET Web API:

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

Ответ 2

Я столкнулся с той же проблемой, что и вы, но без usign Ninject OwinHost, и действительно, я думаю, что проблема не в Ninject, а в Routing.

Проблема заключается в следующем:

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

который использует System.Web.Routing, который содержится в System.Web пространстве имен (Проверить здесь).

Итак, альтернативой этому, который я нашел, является использование rooting с атрибутами. Таким образом, вы можете заменить код выше:

// Web API routes
config.MapHttpAttributeRoutes();

Если вы не знакомы с ним, проверьте этот учебник.

Используя этот подход, вы можете удалить ссылку System.Web вашего проекта.