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?
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;
}
}
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
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