2017-10-23 20 views
0

私はいくつかの非常に単純なASP.NETコア2.0 WebプロジェクトでStartup.csのコード持っている:私のホーム・ページビューでタイプXのサービスは登録されていませんが、サービス登録はOKですか?

public async void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    await CreateContainer(); 

    services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>(); 
} 

private async Task CreateContainer() 
{ 
    string connectionString = Configuration["TestConnectionString"]; 
    var storageAccount = CloudStorageAccount.Parse(connectionString); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer container = blobClient.GetContainerReference("logs"); 
    await container.CreateIfNotExistsAsync(); 
} 

を、私が持っている:

@using Infrastructure.Logging.Contracts 
@inject ILogger logger 

問題があることですアプリケーションがクラッシュして(ビューでコードを実行している):

An unhandled exception occurred while processing the request. 
InvalidOperationException: No service for type 'Infrastructure.Logging.Contracts.ILogger' has been registered. 
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 

Startup.csのすべてのコードは、例外なく成功した実行されます。

しかし、私はこのような単一のコード行を移動することにより、ConfigureServices方法変更した場合:

public async void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>(); 

    await CreateContainer(); 
} 

をすべてが今エラーメッセージなしで正常に動作します。

登録されたクラスを挿入しようとすると、CreateContainerメソッドを呼び出すとエラーが発生する可能性がありますか?これらの操作の間には何の関係もないはずです。

サービスを登録する呼び出しはどの場合でも正常に実行され、デバッガではサービスオブジェクトを調べて登録済みサービスのエントリを確認できます。何らかの形で実行の流れを変える可能性のある例外はありません。私はデバッガでステップを踏んで、すべてをチェックしました。

+0

サービスを名前で登録していますか? "ログ?" – Zinov

+0

ほとんどの場合、 'CreateContainer'操作には時間がかかります。 'ConfigureServices'メソッドは' CreateContainer'オペレーションを開始した直後に終了し、フレームワークは次の作業に移ります。そのうちの1つがあなたの意見を表示しています。したがって、ビューが表示されようとしているときに、CreateContainerがまだ実行されているため、サービスが登録されないことがあります。それを確認する最も簡単な方法は、 'await CreateContainer'の後にロギング(単に' Console.Write'でもかまいません)し、例外の前後に起こるかどうかを確認することです。後で(まったく起こらない) - この仮定が正しいことを意味します。 – Evk

+0

サービスを登録するコードがコードスニペットに示されています。 – OlavT

答えて

-1

問題は、ConfigureServicesメソッド内の非同期メソッドでawaitを呼び出すと発生します。まだ再現

await Task.Delay(200); 

と問題:

await CreateContainer(); 

と:私は、このコード行を置き換えることを試みました。

これはConfigureServices方法の修正版です:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    CreateContainer().Wait(); 

    services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>(); 
} 

これが問題の原因となった理由を私は正確にはわからないが、それはフレームワークのコードで同期の問題のいくつかの並べ替えを引き起こしている必要があります。

+0

'async'操作を開始し、それを待たずにフレームワークではありません。 'Wait()'を使用し、 'await'を使うべきです。さらに、あなたは本当に 'ConfigureServices' asyncを行うべきではありません。それは規約違反です。それは非同期ではありません。 – VMAtm

+0

どの非同期操作が開始され、それを待たなかったのですか? – OlavT

関連する問題