Laden...

ASP.NET Code ausführen nach startup

Erstellt von Ehm vor 2 Jahren Letzter Beitrag vor 2 Jahren 368 Views
E
Ehm Themenstarter:in
5 Beiträge seit 2021
vor 2 Jahren
ASP.NET Code ausführen nach startup

Ich habe ein ASP.NET Blazor Projekt.
Dort sind Services als Singletons registriert.

Nun muss direkt nach dem Startup eine Methode aufgerufen werden welche einen Prozess in gang setzt.
Ich habe versucht diese Funktionalität direkt in der Main Methode zu implementieren, allerdings sind zu diesem Zeitpunkt die Singletons noch nicht ordentlich in Kraft getreten.

Habt ihr eine Idee wie ich das umsetzen könnte?

16.842 Beiträge seit 2008
vor 2 Jahren

Macht man über Hintergrundtasks mit gehosteten Diensten in ASP.NET Core
In der StartAsync kannst Du Dein Prozess (oder was es auch immer ist) starten, ohne, dass Du damit die ASP Core Pipeline beeinflusst oder Requests brauchst.

In der Main Methode ist nichts registriert, ergo kann da auch nichts ausgeführt werden.
Wenn Du wirklich dachtest, dass das geht, dann schau Dir nochmal den Lifecycle für eine ASP.NET Core Anwendung an; weil das ist essentiell, dass Deine Anwendung stabil funktioniert 🙂

E
Ehm Themenstarter:in
5 Beiträge seit 2021
vor 2 Jahren

Habe einen IHostedService angelegt und das darauf ausgelagert.
Weiss acuh nicht was ich mir bei der implementierung in die Main Methode gedacht habe.

Allerdings scheint es jetzt trotzdem an den Singletons zu scheitern.
So habe ich diese Registriert:


public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddDatabaseDeveloperPageExceptionFilter();
            services.AddSingleton<SettingsObject>();
            services.AddSingleton<ComponentService>();
            services.AddSingleton<TimedBackgroundService>();
            services.AddHostedService<ProblematischerService>();
        }

Ich benutze die Constructor injection und starte so einen Timer. Eigentlich sollte der Timer dann auch, wegen des Singleton lifecycles, für andere Services/Razorpages verfügbar sein. Wenn ich aber versuche besagten Timer zu stoppen bekomme ich Exceptions da die erforderlichen Singletons null oder nicht befüllt sind. Es scheint so als ob eine weitere Instanz angelegt worden ist.


public class ProblematischerService: IHostedService
    {
        private SettingsObject settings;
        private TimedBackgroundService backgroundService;
        private readonly ComponentService componentService;

        public AutomaticStartService(ComponentService _componentService, TimedBackgroundService _backgroundService, SettingsObject _settings)
        {
            componentService = _componentService;
            settings = componentService.GetSettings();
            backgroundService = new(componentService, settings);
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            if (settings.AutomaticStart)
            {
                return backgroundService.StartTimer(new CancellationToken());
            }
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

16.842 Beiträge seit 2008
vor 2 Jahren

Ja, siehe Dokumentation: der Singleton gilt pro aufgelösten Dependency Container und pro HostedService gibt es eine Auflösung, damit verschiedene Instanzen.

Erklär mal bitte was Du vor hast; mir ist noch nie eine Situation begegnet, bei dem Dein Vorhaben mit einem Shared Singleton sinnvoll ist.
Ich vermute, dass Du den falschen Ansatz verfolgst.