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

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

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

Тип System.Web.Routing.Route определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку System.Web, Version = 4.0.0.0, Culture = нейтральный, 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;
            }
        }
    }
}

person HungryPipo    schedule 05.09.2014    source источник


Ответы (2)


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

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


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

Проблема заключалась в том, что когда я выполнил 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" />
person Mariusz Pawelski    schedule 05.10.2015
comment
Мне понадобились эти 3, в дополнение к перечисленным вами, чтобы моя работа (.NET 4.5.1) в качестве службы Windows: Microsoft.AspNet.WebApi.OwinSelfHost Microsoft.Owin.Host.HttpListener Microsoft.Owin.Hosting - person HungryPipo; 04.12.2015
comment
Добавление Ninject (один из пакетов NUGet), похоже, добавляло ссылку, которая, кажется, нарушает это! Простое решение - удалить эту ссылку !! - person shivesh suman; 11.08.2016
comment
Добавление к вышесказанному: ручное добавление ссылки на system.web также, похоже, устраняет ошибку и в настоящее время использует этот подход вместо удаления ссылки на System.Web.Http.WebHost (на данный момент не совсем ясно, если эта ссылка является избыточным). - person shivesh suman; 12.08.2016
comment
Отлично, ты сделал мой день! - person Fabricio; 11.04.2018

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

Проблема в этом коде:

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

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

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

// Web API routes
config.MapHttpAttributeRoutes();

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

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

person Xavier Egea    schedule 17.09.2014
comment
Первоначально у меня был app.UseWebApi (config), поэтому часть Routes.MapHttpRoute была там, и она разрешилась без System.Web. Но при добавлении Ninject потребовался System.Web. Мне нужен Ninject для внедрения зависимостей с помощью MapHttpAttributesRoutes (), как мне запустить Ninject? - person HungryPipo; 18.09.2014
comment
Это хороший практический обходной путь, но я немного сбит с толку, почему вызов config.Routes.MapHttpRoute требует ссылки на System.Web. Ни один из типов, участвующих в вызове (IHttpRoute, HttpRouteCollection, RouteParameter), не объявлен в этой сборке, все они из System.Web.Http.Routing. И сборка System.Web.Http, содержащая HttpCollection, не зависит от System.Web. Вы можете объяснить, как возникла эта зависимость? - person Peter; 18.03.2015