我正在构建一个 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);
从我的配置方法,一切正常。
那么,有没有人知道出了什么问题以及我该如何解决这个问题?