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
패키지를 추가하고 다른 코드를 변경하지 않아도 동일한 결과가 나타납니다. 제거한 후에는 모든 것이 잘 작동합니다. 여기
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()
예외의 _full 스택 trace_ 및 그 내부 예외를 항상 게시하십시오. – Steven
또한'DefaultDependencyResolver.GetServices' 메쏘드에 버그가 있습니다. 왜냐하면'IDependencyScope.GetServices'는 절대로'null'을 리턴해서는 안되기 때문에'IServiceProvider.GetServices (Type)'는 등록이 없을 때'null '을 리턴 할 것입니다. '유형'을 지정하십시오. – Steven
스택 추적, 메시지 및 _all의 예외 유형과 같은 정보를 내부 예외 _에도 추가하십시오. – Steven