2014-09-05 119 views
11

我正在尝试使用Ninject自己托管的WebAPI创建一个Windows服务。我得到它的工作,但我不得不添加一个引用system.web,这似乎是错误的。如果不能的System.Web参考我这些编译错误:OWIN自主应用程序使用Ninject OWINHost需要system.web吗?

类型“System.Web.Routing.RouteCollection”在未引用的 集中定义。您必须添加对组件 'System.Web,Version = 4.0.0.0,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'的引用。

类型'System.Web.Routing.Route'在程序集中定义,该程序集未引用 。您必须添加对程序集'System.Web的引用, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。

的错误,出现了我根据这篇文章 Setting up a OWIN WebApi application

我也只好到Microsoft.Owin限制到2.1.0版本Ninject工作添加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" /> 

下面是Windows服务的Program.cs的样子

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

回答

12

尝试从参考文件中删除System.Web.Http.WebHost.dll

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


我有同样的问题时,我想有一个API项目作为类库和(使用控制台和其他IIS一个)独立的主机项目,在this great blog post

问题描述是当我执行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和删除packages.jsonMicrosoft.AspNet.WebApiMicrosoft.AspNet.WebApi.WebHost所以不会再次安装时,有些人会做的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" /> 
+0

我需要这3个,除了你列出的,使我的工作(.NET 4.5.1)作为一个Windows服务: “Microsoft.AspNet.WebApi.OwinSelfHost” “Microsoft.Owin.Host.HttpListener “ ”Microsoft.Owin.Hosting“ – HungryPipo 2015-12-03 21:17:42

+0

添加Ninject(NUGet包之一)似乎正在添加引用,似乎打破了这一点!简单的解决方案是删除该参考! – 2016-08-11 01:58:26

+0

添加到上面:手动添加对system.web的引用也似乎使错误消失,并且目前使用此方法而不是移除对System.Web.Http.WebHost的引用(目前尚不完全清楚参考是多余的)。 – 2016-08-11 23:16:57

4

我同样的问题遇到了你,但没有usign Ninject OwinHost,而事实上我认为问题不在于Ninject,但路由。

问题是这样的码:

config.Routes.MapHttpRoute(
    "DefaultApi", 
    "api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 
使用 System.Web.Routing至极被包含在 的System.Web命名空间( Check here

所以,我发现的替代方案是使用具有属性的生根。所以,你可以通过这个替换上面的代码:

// Web API routes 
config.MapHttpAttributeRoutes(); 

如果你不熟悉它,检查this tutorial

使用此方法,您可以删除项目的System.Web引用。

+1

起初我有 “app.UseWebApi(配置)” 等等“Routes.MapHttpRoute”部分在那里,它没有System.Web解析。但是通过添加Ninject,System.Web是必需的。 我需要Ninject进行依赖注入,使用MapHttpAttributesRoutes()如何启动Ninject? – HungryPipo 2014-09-17 20:47:25

+2

这是一个很好的实用解决方法,但是我为了调用'config.Routes.MapHttpRoute'需要引用'System.Web',有点困惑。调用中涉及的所有类型('IHttpRoute','HttpRouteCollection','RouteParameter')都在该程序集中声明,它们全部来自'System.Web.Http.Routing'。包含'HttpCollection'的'System.Web.Http'程序集不依赖于'System.Web'。你能解释这种依赖性是如何产生的吗? – Peter 2015-03-18 05:52:27

相关问题