2017-10-23 4 views
1

Microsoft Extensions Dependency Injection을 기존 ASP.NET WebApi/Owin 프로젝트에 추가하려고합니다.Microsoft Asp.NET Dependency Injection을 사용할 때 HttpActionContext.get_Request() 메서드를 찾을 수 없습니다.

this blog post 다음에 ConfigureServices 함수를 추가하고 DependencyResolver을 구현하고 HttpConfiguration 인스턴스를 사용했습니다.

또한 모든 비 추상 컨트롤러를 DI에 추가하고 DI 메커니즘을 사용하여 인스턴스화되도록했습니다.

그러나 이러한 모든 작업을 한 후, 예외 응용 프로그램 반환 오류 500 찾을 수 없습니다

방법 요청합니다 'System.Net.Http.HttpRequestMessage System.Web.Http.Controllers.HttpActionContext.get_Request을() '.

NuGet에 Microsoft.Extensions.DependencyInjection 패키지를 추가하고 다른 코드를 변경하지 않아도 동일한 결과가 나타납니다. 제거한 후에는 모든 것이 잘 작동합니다. 여기

내가 Startup.cs에 추가하는 코드입니다 :

DependcyResolver 구현 : 서비스 구성 및 설정을 호출 ServiceCollection 만들기

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

:

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에 컨트롤러 종속성 Resolver :

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

예외 스택 추적 : 당신은 당신의 web.config 파일에 바인딩 리디렉션을 추가해야 할 수도 있습니다

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() 
+0

예외의 _full 스택 trace_ 및 그 내부 예외를 항상 게시하십시오. – Steven

+1

또한'DefaultDependencyResolver.GetServices' 메쏘드에 버그가 있습니다. 왜냐하면'IDependencyScope.GetServices'는 절대로'null'을 리턴해서는 안되기 때문에'IServiceProvider.GetServices (Type)'는 등록이 없을 때'null '을 리턴 할 것입니다. '유형'을 지정하십시오. – Steven

+0

스택 추적, 메시지 및 _all의 예외 유형과 같은 정보를 내부 예외 _에도 추가하십시오. – Steven

답변

1

내가 설치 한 'System.Net.Http'nuget에서 (V 4.3.3) msbuild가 지정된 dll을 사용하도록 강제로 내 .csproj 파일을 업데이트했습니다.

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

문제가 해결되었습니다.