Ninject在HttpContextBase.get_Response()中导致NotImplementedException

时间:2015-02-12 09:07:04

标签: asp.net-web-api dependency-injection ninject notimplementedexception

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

首先,我尝试使用NuGet Package Manager安装它,但是在安装时出现以下错误:

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'.

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

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

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

这是我设置的Ninject的配置,遵循this Ninject GitHub post中的说明。

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

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

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

1 个答案:

答案 0 :(得分:3)

在尝试与NotImplementedException

撰写链接时,我偶然发现this.Url.Link("DefaultApi", new { controller="controller_name", id = "some_id" })同样的问题

事实证明,未正确配置Web API。关键是使用完全不同的HttpConfiguration,而不是全局的:{/ p>

  // 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