Jak programowo uruchomić aplikację w asp.netu?Jak programowo zrestartować aplikację core asp.net?
Chcę wyczyścić pamięć podręczną i spowodować, że aplikacja ponownie uruchomi się.
Jak programowo uruchomić aplikację w asp.netu?Jak programowo zrestartować aplikację core asp.net?
Chcę wyczyścić pamięć podręczną i spowodować, że aplikacja ponownie uruchomi się.
Jeśli potrzebujesz tego tylko do scenariusza rozwoju, możesz użyć dotnet-watch (dla dotnet) lub dnx-watch (dla dnx).
Jeśli chcesz, aby aplikacja ponownie uruchomiła się w produkcji, musisz zaimplementować coś podobnego do tego, co robi obserwator. Aby zabić i ponownie uruchomić proces, potrzebujesz zewnętrznego procesu. Lub potrzebujesz aplikacji, by uruchomić samą instancję, a następnie zabić się. Niestety, nie ma nic poza tym.
To byłby hack, ale czy aplikacja może programowo zmienić plik konfiguracyjny, który uruchomi restart aplikacji? –
Aktualizacja: Mirask's answer jest bardziej poprawne NET rdzenia 2.
W Program.cs pojawi się wezwanie do host.Run()
. Ta metoda ma przeciążenie, które akceptuje wartość System.Threading.CancellationToken
. To, co robię:
public class Program {
private static CancellationTokenSource cancelTokenSource = new System.Threading.CancellationTokenSource();
public static void Main(string[] args) {
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run(cancelTokenSource.Token);
}
public static void Shutdown() {
cancelTokenSource.Cancel();
}
}
Następnie w moim kontrolera mogę zadzwonić Program.Shutdown()
i po kilku sekundach aplikacja umiera. Jeśli znajduje się za IIS, kolejne żądanie automatycznie uruchomi aplikację.
To jest absolutnie idealne, dziękuję. Jeśli chodzi o obsługę tego hostowanego przez IIS, jest to znacznie lepsze niż dodanie odwołania do Microsoft.Web.Administration lub majsterkowanie z plikiem web.config, aby oszukać recykling IIS. –
Mała aktualizacja. Odkryłem, że metoda Run (token) nie jest już dostępna w .NET Core 2.0. Użyłem następującego wiersza do obejścia tego: .RunAsync (cancellationTokenSource.Token) .GetAwaiter(). GetResult(); – Schwarzie2478
Dzięki, zastanawiałem się, jak to zrobić od czasu aktualizacji. Powinieneś zrobić to odpowiedź. – Chet
.NET Core 2
Może nadejść czas, kiedy chcesz, aby wymusić witryny ASP.Net Core 2 do recyklingu programowo. Nawet w dniach MVC/WebForms niekoniecznie była to zalecana praktyka, ale niestety, jest jakiś sposób. ASP.Net Core 2 pozwala na wstrzyknięcie obiektu IApplicationLifetime, który pozwoli ci zrobić kilka przydatnych rzeczy. Po pierwsze, pozwala rejestrować zdarzenia dotyczące uruchamiania, zamykania i zamykania podobne do tego, co mogło być dostępne przez Global.asax w ciągu dnia. Ale to również ujawnia metodę, aby umożliwić zamknięcie strony (bez hack!). Musisz wstrzyknąć to do swojej witryny, a następnie po prostu wywołać. Poniżej znajduje się przykład kontrolera z trasą, która zamknie witrynę.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
namespace MySite.Controllers
{
public class WebServicesController : Controller
{
private IApplicationLifetime ApplicationLifetime { get; set; }
public WebServicesController(IApplicationLifetime appLifetime)
{
ApplicationLifetime = appLifetime;
}
public async Task ShutdownSite()
{
ApplicationLifetime.StopApplication();
return "Done";
}
}
}
Źródło: http://www.blakepell.com/asp-net-core-ability-to-restart-your-site-programatically-updated-for-2-0
Żeby lepiej zrozumieć, dlaczego trzeba to? –
Myślę, że najczęstszym scenariuszem jest dla mnie manipulowanie ustawieniami aplikacji za pomocą widoku administracyjnego. Ustawienia często są inicjowane podczas uruchamiania. –
innym sposobem, który mogę myśleć jest opublikowanie nowej wersji i ponowne uruchomienie. –