web-dev-qa-db-fra.com

Où puis-je enregistrer les événements de démarrage / d'arrêt / d'erreur d'une application ASP.NET Core?

Dans l'ancien ASP.NET, dans la classe Global.asax.cs, Je me connectais lorsque l'application démarre, s'arrête et lève des exceptions non gérées:

  • Application_Start()
  • Application_End()
  • Application_Error()

Comment faire la même chose dans ASP.NET Core? Il a une classe Startup, mais c'est pour la configuration.

Où puis-je me connecter aux événements de démarrage/d'arrêt/d'erreur de l'application?

24
grokky

Vous devez utiliser Microsoft.AspNetCore.Hosting.IApplicationLifetime

    /// <summary>
    /// Triggered when the application Host has fully started and is about to wait
    /// for a graceful shutdown.
    /// </summary>
    CancellationToken ApplicationStarted { get; }

    /// <summary>
    /// Triggered when the application Host is performing a graceful shutdown.
    /// Requests may still be in flight. Shutdown will block until this event completes.
    /// </summary>
    CancellationToken ApplicationStopping { get; }

    /// <summary>
    /// Triggered when the application Host is performing a graceful shutdown.
    /// All requests should be complete at this point. Shutdown will block
    /// until this event completes.
    /// </summary>
    CancellationToken ApplicationStopped { get; }

L'instance de IApplicationLifetime a pu être obtenue dans la méthode Configure. Ajoutez également ILoggerFactory ici:

public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory)
{
    // use applicationLifetime
}

Avec ILoggerFactory, vous pouvez créer instance de ILogger:

var logger = loggerFactory.CreateLogger("StartupLogger"); 

Il vous suffit donc de créer une propriété dans la classe Startup pour conserver l'instance de ILogger (ou ILoggerFactory, si vous souhaitez créer une instance de ligger différente pour différents événements). Résumer:

public class Startup 
{
    private ILogger _logger;

    public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory) 
    {
        applicationLifetime.ApplicationStopping.Register(OnShutdown);
        ... 
        // add logger providers
        // loggerFactory.AddConsole()
        ...
        _logger = loggerFactory.CreateLogger("StartupLogger");
    }

    private void OnShutdown()
    {
         // use _logger here;
    }
}
27
Set

Veuillez voir CaptureStartupErrors et la méthode .CaptureStartupErrors(true) qui vous aidera à trouver des problèmes.

C'est particulièrement pratique lorsque quelque chose fonctionne parfaitement sur localhost mais échoue dans Azure.

Voici ma configuration habituelle pour NetCore Web Apps:

public static IWebHost BuildWebHost(string[] args) => WebHost
            .CreateDefaultBuilder(args)
            .CaptureStartupErrors(true)
            .UseKestrel()
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseAzureAppServices()
            .Build();

Dans Azure App Service, vous pouvez ensuite trouver les journaux dans le flux de journaux dans Kudu Tools https://<appname>.scm.azurewebsites.net/api/logstream

6
Jonas Stensved

En utilisant Microsoft.AspNetCore.Hosting.IApplicationLifetime suggéré dans la première réponse est désormais obsolète.

[Obsolete("This type is obsolete and will be removed in a future version. The recommended alternative is Microsoft.Extensions.Hosting.IHostApplicationLifetime.", false)]
public interface IApplicationLifetime

Utilisez IHostApplicationLifetime pour déclencher le rappel lorsque l'application s'arrête.

Ajoutez quelque part:

public static async Task WaitForShutdownAsync(this IHost Host)
{
    // Get the lifetime object from the DI container
    var applicationLifetime = Host.Services.GetService<IHostApplicationLifetime>();

    // Create a new TaskCompletionSource called waitForStop
    var waitForStop = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);

    // Register a callback with the ApplicationStopping cancellation token
    applicationLifetime.ApplicationStopping.Register(obj =>
    {
        var tcs = (TaskCompletionSource<object>)obj;

        //PUT YOUR CODE HERE 

        // When the application stopping event is fired, set 
        // the result for the waitForStop task, completing it
        tcs.TrySetResult(null);
    }, waitForStop);

    // Await the Task. This will block until ApplicationStopping is triggered,
    // and TrySetResult(null) is called
    await waitForStop.Task;

    // We're shutting down, so call StopAsync on IHost
    await Host.StopAsync();
}

Ensuite, je l'utilise dans Program.cs:

var Host = CreateHostBuilder(args).Build();
Host.WaitForShutdownAsync();

De même pour les autres rappels. Plus d'informations que vous pouvez trouver ici

Si j'ai raté quelque chose, faites-le moi savoir

0
neustart47