簡體   English   中英

在 ASP.Net Core 應用程序啟動期間運行異步代碼

[英]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>();
    }
}

所以重要的是:

  1. 注冊您的 StartupTasks
  2. 構建主機
  3. 解決 StartupTasks
  4. 運行啟動任務
  5. 啟動主機

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM