2016-03-21 13 views
8

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ę.

+0

Żeby lepiej zrozumieć, dlaczego trzeba to? –

+0

Myślę, że najczęstszym scenariuszem jest dla mnie manipulowanie ustawieniami aplikacji za pomocą widoku administracyjnego. Ustawienia często są inicjowane podczas uruchamiania. –

+1

innym sposobem, który mogę myśleć jest opublikowanie nowej wersji i ponowne uruchomienie. –

Odpowiedz

3

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.

+4

To byłby hack, ale czy aplikacja może programowo zmienić plik konfiguracyjny, który uruchomi restart aplikacji? –

13

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ę.

+0

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. –

+3

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

+0

Dzięki, zastanawiałem się, jak to zrobić od czasu aktualizacji. Powinieneś zrobić to odpowiedź. – Chet

3

.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