2017-10-23 12 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へのコントローラ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() 
+0

例外の_fullスタックtrace_とその内部例外を常にポストします。 – Steven

+1

'DefaultDependencyResolver.GetServices'メソッドにはバグがあります。' IDependencyScope.GetServices'は決して 'null'を返すべきではないので、' IServiceProvider.GetServices(Type) 'は' null'を返します。指定された 'Type'。 – Steven

+0

スタックトレース、メッセージ、_allの例外タイプなどの情報を内部例外として追加してください。 – Steven

答えて

1

私がインストールした 'System.Net.Http' nugetから(V 4.3.3) .csprojファイルを更新して、指定したdllをmsbuildに強制的に適用させました:

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

問題を解決しました。

関連する問題