使用Microsoft Asp.NET依赖注入时找不到HttpActionContext.get_Request()方法

时间:2017-10-23 11:03:42

标签: c# asp.net dependency-injection

我正在尝试将Microsoft Extensions Dependency Injection添加到现有的ASP.NET WebApi / Owin项目中。

关注this blog post后,我添加了ConfigureServices函数,已实施DependencyResolver,并使HttpConfiguration实例可以使用它。

我还将所有非抽象控制器添加到DI中,并确保使用DI机制对它们进行实例化。

但是在所有这些操作之后,对应用程序的请求返回错误500,异常

  

找不到方法:'System.Net.Http.HttpRequestMessage System.Web.Http.Controllers.HttpActionContext.get_Request()'。

即使我只是将Microsoft.Extensions.DependencyInjection包添加到NuGet并且不更改任何其他代码,我也会得到相同的结果。删除后,一切正常。

以下是我在Startup.cs中添加的代码:

DependcyResolver实施:

public class DefaultDependencyResolver :
    System.Web.Http.Dependencies.IDependencyResolver, 
    System.Web.Http.Dependencies.IDependencyScope
{
    protected IServiceProvider serviceProvider;

    public DefaultDependencyResolver(IServiceProvider serviceProvider)
    {
        this.serviceProvider = serviceProvider;
    }

    public IDependencyScope BeginScope()
    {
        return this;
    }

    public void Dispose() { }

    public object GetService(Type serviceType)
    {
        return this.serviceProvider.GetService(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return this.serviceProvider.GetServices(serviceType);
    }

}

将控制器添加到DI:

public void ConfigureServices(IServiceCollection services)
{
    System.Diagnostics.Debugger.Launch();   
    IEnumerable<Type> controllers = typeof(Startup).Assembly.GetExportedTypes()
       .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
       .Where(t => typeof(IController).IsAssignableFrom(t)
          || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase));

    foreach (var c in controllers)
    {
        services.AddTransient(c);
    }
}

创建ServiceCollection,调用服务配置并设置DependencyResolver:

public void Configuration(IAppBuilder app) {
    // ...
    HttpConfiguration httpConfiguration = new HttpConfiguration();

    var services = new ServiceCollection();
    ConfigureServices(services);

    httpConfiguration.DependencyResolver = 
        new DefaultDependencyResolver(services.BuildServiceProvider());

    WebApiConfig.Register(httpConfiguration);
    app.UseWebApi(httpConfiguration);
}

异常堆栈跟踪:

at myCompany.myProduct.Controllers.SomeController.Get(String id, String offline)
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

我已经安装了System.Net.Http&#39;来自nuget(v 4.3.3)并更新了我的.csproj文件以强制msbuild使用指定的dll:

<Reference Include="System.Net.Http, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll</HintPath>
</Reference>

它解决了这个问题。