2

我正在构建一个 ASP.NET Web API 2 项目。我想使用依赖注入,所以我为此安装了 Ninject Library。

起初,我尝试使用 NuGet 包管理器安装它,但安装时出现以下错误:

Install failed. Rolling back...
Updating 'Microsoft.Owin 3.0.0' to 'Microsoft.Owin 2.0.0' failed. 
Unable to find versions of 'Microsoft.Owin.Security,
Microsoft.Owin.Security.Cookies, Microsoft.Owin.Security.OAuth, 
Microsoft.AspNet.WebApi.Owin, Microsoft.Owin.Host.SystemWeb, 
Microsoft.Owin.Security.Facebook, Microsoft.Owin.Security.Google, 
Microsoft.Owin.Security.MicrosoftAccount, Microsoft.Owin.Security.Twitter'
that are compatible with 'Microsoft.Owin 2.0.0'.

然后,我按照本文中建议在 NuGet 包管理器控制台中运行以下命令的说明进行操作:

Install-Package Ninject.Web.WebApi.OwinHost -Version 3.2.1 -DependencyVersion Highest

输入此命令后,包安装成功。

这是我按照此 Ninject GitHub 帖子中的说明设置的 Ninject 配置。

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);

        app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(GlobalConfiguration.Configuration);
    }

    private static StandardKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }

这就是问题发生的地方。我想在我的一些控制器中使用 CreatedAtRoute() 方法。

return CreatedAtRoute("GetMyResourceByIdRoute",
            new { id = myResource.Id },
            myResource);

当我调用使用 CreatedAtRoute() 的方法时,出现以下异常:

System.NotImplementedException

Stack trace: at System.Web.HttpContextBase.get_Response()\r\n   
at System.Web.UI.Util.GetUrlWithApplicationPath(HttpContextBase context, 
String url)\r\n   at System.Web.Routing.RouteCollection.NormalizeVirtualPath
(RequestContext requestContext, String virtualPath)\r\n   at 
System.Web.Routing.RouteCollection.GetVirtualPath(RequestContext 
requestContext, String name, RouteValueDictionary values)\r\n   at 
System.Web.Http.WebHost.Routing.HostedHttpRouteCollection.GetVirtualPath
(HttpRequestMessage request, String name, IDictionary`2 values)\r\n   at 
System.Web.Http.Routing.UrlHelper.GetVirtualPath(HttpRequestMessage request, String routeName, IDictionary`2 routeValues)\r\n   at 
System.Web.Http.Routing.UrlHelper.Route(String routeName, IDictionary`2 routeValues)\r\n   at 
System.Web.Http.Routing.UrlHelper.Link(String routeName, IDictionary`2 routeValues)\r\n   at 
System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.Execute()\r\n   at 
System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.ExecuteAsync(CancellationToken cancellationToken)\r\n   at 
System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at 
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at 
System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown 
---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at 
System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at 
System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

我的结论是我的 Ninject 配置存在一些问题,因为当我注释掉时

app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(GlobalConfiguration.Configuration);

从我的配置方法,一切正常。

那么,有没有人知道出了什么问题以及我该如何解决这个问题?

4

1 回答 1

3

NotImplementedException在尝试与this.Url.Link("DefaultApi", new { controller="controller_name", id = "some_id" })

原来 Web API 配置不正确。关键是使用完全不同的HttpConfiguration,而不是全局的:

  // initialize web pages & mvc routing first
  AreaRegistration.RegisterAllAreas();
  ConfigureRoutes(RouteTable.Routes);
  BundleConfig.RegisterBundles(BundleTable.Bundles);

  // set up IOC and configure authentication
  app.UseNinjectMiddleware(CreateKernel);
  ConfigureAuth(app);

  // finally the web api, on its own http configuration
  var webApiConfig = new HttpConfiguration();
  webApiConfig.MapHttpAttributeRoutes();
  webApiConfig.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate:api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional });
  app.UseNinjectWebApi(webApiConfig);

  // ensure all the configs are ready
  webApiConfig.EnsureInitialized();
  GlobalConfiguration.Configuration.EnsureInitialized();

确保您获得了最新的 OWIN 软件包,包括Ninject.Web.Common.OwinHostNinject.Web.WebApi.OwinHost.

于 2015-07-14T15:17:23.737 回答