Web Api 2 + OWIN 3 + NInject.Web.WebApi.OwinHost 启动时出错

9
我正在使用Web API2,Owin 3和NInject Owinhost来构建rest API,并使用NInject提供的示例。在startup.cs中创建“HttpConfiguration”对象并调用NInject扩展方法时,我遇到了一个错误:

激活HttpConfiguration出错 多个匹配绑定可用。 匹配的绑定:  1)从HttpConfiguration到方法的绑定  2)自我绑定的HttpConfiguration  3)从HttpConfiguration到常量值的绑定 激活路径:  1)对HttpConfiguration的请求

建议: 1)确保您仅为HttpConfiguration定义了一次绑定。

我的代码如下:
 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;
    }

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

所以我对此感到困惑。有人遇到过类似的问题吗?

谢谢

Vincent


我在一个新项目中也遇到了这个问题。抛出此错误的中间件是:app.UseNinjectWebApi(config); 当我将其注释掉时,一切都按预期工作。我仍在继续挖掘以找出发生了什么。 - sgmeyer
1
有点傻的猜测,但是当你将绑定从HttpConfiguration更改为TestHttpConfiguration时会发生什么? - sgmeyer
嗨,感谢您回复我。不幸的是,我没有成功地让我的原始项目工作。请看下面我的回答,我通过从头开始安装包并使用控制台来解决了这个问题。就像您一样,app.useNInjectWebApi引起了错误,但无论我如何处理它,它都在httpconfiguration上失败。不确定这是否对您有帮助,希望能有所帮助。让我知道。 - vm2013
是的,我最终做了完全相同的事情。虽然我不确定发生了什么,但对我来说从头开始也行得通。 - sgmeyer
很高兴你也解决了它。 - vm2013
请参考类似问题的链接:https://dev59.com/auo6XIcBkEYKwwoYGwUw。 - ngm
2个回答

9
我曾遇到同样的错误,因为我不知道原因同时安装了Ninject.Web.WebApi.WebHostNinject.Web.WebApi.OwinHost
如果你查看OwinWebApiModule.csWebApiWebHostModule.cs的源代码,两个 Ninject 模块都绑定了HttpConfiguration
我删除了我不需要的一个,然后就可以了。

7
您可能需要手动删除 /bin 文件夹中的内容。我的文件夹里有一个 Ninject.Web.WebApi.WebHost 的 DLL 文件,尽管我已经删除了 NuGet 和引用。即使清理和重建也没有删除它们。我手动删除了 /bin 文件夹的所有内容,一切都重新开始正常工作了。 - crush

5

更新

尝试了一切之后,我通过......从头开始创建一个新项目,最终成功让它工作了。我有这个奢侈的条件,因为这对我来说是一个新的概念证明。

主要的区别在于,我使用包管理器控制台安装所需的包(owin 3, ninject),而不是使用UI界面。我按照这里的链接来安装这些包。

然后,我注意到一个错误信息,其中一个包正在寻找 Owin 2 的依赖关系,无法找到任何内容。我强制使用 -DependencyVersion Highest 参数进行安装,并且从一开始就可以正常工作。

除非我错过了什么,否则在使用UI界面安装包时,我没有看到这个错误。这是否意味着该程序包之前在我的另一个项目上没有正确安装?不确定。

希望这能帮助某人。


13
我发现问题出在这个 Nuget 包 "Ninject.Web.WebApi" 上。 当使用 3.2.0.0 版本时,会出现错误。一旦我将该 Nuget 包更新到版本 3.2.4.0,一切都可以正常工作,无需进行其他更改。 - sgmeyer
本地开发时一切正常,但部署到 Azure 后出现问题。根据 sgmeyer 的解决方案,将 NuGet 包更新到 3.2.4 版本即可解决问题。 - mkaj
不必从头开始创建新项目,我清空了我的bin目录,删除了packages文件夹并恢复了所有的包。 - Ody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接