[英]Run async code during startup in a ASP.Net Core application
在將 function ConfigureServices
的簽名更改為異步后(最初它只是一個 void 同步 function 並且應用程序運行良好),我收到以下錯誤:
找不到所需的服務。 請通過在應用程序啟動代碼中對
ConfigureServices(...)
的調用中調用IServiceCollection.AddAuthorization
添加所有必需的服務。
下面是我的ConfigureServices
function 的代碼。
// This method gets called by the runtime. Use this method to add services to the container.
public async Task ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// Create the necessary Cosmos DB infrastructure
await CreateDatabaseAsync();
await CreateContainerAsync();
}
ConfigureServices
在運行時自動調用。
您不能只更改簽名,它必須是無效的才能被框架調用。
現在,當您將其更改為 Task 時,這意味着框架找不到它,因此根本不會調用它。
這里有一個 GitHub 問題: https://github.com/dotnet/aspnetcore/issues/5897
雖然這很棘手......
5.0 沒有進展 不,我們不知道如何在不阻止或破壞更改的情況下做到這一點。 可以在從不重疊的 2 個階段運行過濾器。
根據您的評論進行更新:如果您想在啟動期間運行異步操作,我通常會這樣做:
我創建一個這樣的界面:
public interface IStartupTask
{
Task Execute();
}
然后是這樣的示例實現
public class CreateDatabaseStartupTask : IStartupTask
{
public async Task Execute()
{
// My logic here
// await CreateDatabaseAsync();
}
}
然后在我的 Program.cs
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
// Resolve the StartupTasks from the ServiceProvider
var startupTasks = host.Services.GetServices<IStartupTask>();
// Run the StartupTasks
foreach(var startupTask in startupTasks)
{
await startupTask.Execute();
}
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
還有我的初創公司
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IStartupTask, CreateDatabaseStartupTask>();
}
}
所以重要的是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.