2015-02-17 47 views
8

我正在为我的DI构建Web API2,Owin 3和NInject Owinhost的其余API。Web Api 2 + OWIN 3 + NInject.Web.WebApi.OwinHost,仅在启动时出错

使用NInject提供的示例中,我创建一个“HttpConfiguration”对象,并调用startup.cs的NInject扩展方法,我得到一个错误:

Error activating HttpConfiguration More than one matching bindings are available. Matching bindings: 1) binding from HttpConfiguration to method 2) self-binding of HttpConfiguration 3) binding from HttpConfiguration to constant value Activation path: 1) Request for HttpConfiguration

Suggestions: 1) Ensure that you have defined a binding for HttpConfiguration only once.

我的代码遵循启动.cs:

public void Configuration(IAppBuilder app) 
    { 
     Logger.Info("Entering Startup"); 

     config = new HttpConfiguration(); 

     ConfigureOAuth(app); 

     // Web API configuration and services 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter("Bearer")); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

     var appXmlType = 
      config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(
       t => t.MediaType == "application/xml"); 
     config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); 

     app.UseNinjectMiddleware(CreateKernel); 

     app.UseNinjectWebApi(config); 

     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     Logger.Info("Exiting Startup"); 

    } 


    public static StandardKernel CreateKernel() 
    { 
     kernel = new StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 

     kernel.Bind<HttpConfiguration>().ToSelf().Named("TestHttpConfiguration"); 

     return kernel; 
    } 

奇怪的是,当我在浏览器中刷新页面时,错误消失了,这导致我相信这只发生在应用程序启动时。

所以我很困惑这一点。有没有人遇到过与此相同的问题?

感谢

文森特

+0

我刚刚开始在新项目上面对这个问题。抛出这个错误的中间件是:app.UseNinjectWebApi(con​​fig);当我评论说,一切都按预期工作。我仍在四处探索发生了什么事情。 – sgmeyer 2015-02-20 11:28:08

+1

愚蠢的猜测,但是当你将你的绑定绑定到HttpConfiguration到TestHttpConfiguration时会发生什么? – sgmeyer 2015-02-20 11:29:55

+0

嗨,谢谢你回复我,可惜我没有设法开始工作我的原始项目。在下面看到我的回答我从零开始并使用控制台安装软件包对它进行了分类。像你一样,它是导致错误的app.useNInjectWebApi,但不管我如何处理它,它都保持在这个http配置上失败。不知道这会帮助你,我希望它。让我知道。 – vm2013 2015-02-23 09:19:11

回答

5

UPDATE

乱投医后,我设法得到它...从头开始一个新的项目工作。我有这样做的奢侈,因为它对我来说是一个新概念的证明。

这里的主要区别是我使用包管理器控制台而不是UI安装了所需的包(owin 3,ninject)。我在这里跟着这个link来安装这些软件包。

然后我注意到一个包中的错误信息,因为它正在寻找Owin 2的依赖关系,并且找不到任何东西。我强制它使用-DependencyVersion作为参数进行安装,从一开始它就工作得很好。

除非我错过了,我没有看到这个错误,当我使用UI安装软件包。是否有可能该软件包以前没有正确安装在我的其他项目上?不确定。

希望这可以帮助别人。

+13

我发现问题是这个nuget包“Ninject.Web.WebApi”使用3.2.0.0版时,存在错误。一旦我将该nuget包更新到版本3.2.4.0,所有工作都无需任何额外的更改。 – sgmeyer 2015-03-09 16:03:27

+0

对于我来说,一切工作都很好,但在部署到Azure后并没有工作。根据sgmeyer的解决方案,将nuget软件包更新到版本3.2.4解决了这个问题。 – mkaj 2015-12-20 23:29:59

+0

而不是从头开始创建一个新项目,我清空我的bin目录,删除我的包文件夹并恢复所有包 – Ody 2016-06-22 09:12:13

9

我有这个相同的错误,由于某种原因,我已经安装了Ninject.Web.WebApi.WebHostNinject.Web.WebApi.OwinHost

如果您在源代码中查找OwinWebApiModule.csWebApiWebHostModule.cs,则两个Ninject模块都具有对HttpConfiguration的绑定。

我删除了一个我不需要的东西和工作。

+6

您可能需要手动删除'/ bin'文件夹的内容。我的'Ninject.Web.WebApi.WebHost'有一个DLL文件,尽管我已经删除了NuGet和References。即使是清洁和重建也不会删除它们。我手动删除了'/ bin'的所有内容,一切又开始工作。 – crush 2016-01-09 02:15:23