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へのコントローラ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()
例外の_fullスタックtrace_とその内部例外を常にポストします。 – Steven
'DefaultDependencyResolver.GetServices'メソッドにはバグがあります。' IDependencyScope.GetServices'は決して 'null'を返すべきではないので、' IServiceProvider.GetServices(Type) 'は' null'を返します。指定された 'Type'。 – Steven
スタックトレース、メッセージ、_allの例外タイプなどの情報を内部例外として追加してください。 – Steven