2016-07-25 14 views
9

Mam aplikację ASP.NET Core, która będzie używana jako klient przez wielu użytkowników. Innymi słowy, nie będzie on hostowany na centralnym serwerze i uruchomi opublikowany plik wykonywalny w dowolnym momencie, gdy będzie potrzebował korzystać z aplikacji.Jak uruchomić przeglądarkę po uruchomieniu aplikacji ASP.NET Core?

W pliku Program.cs jest następujący:

var host = new WebHostBuilder() 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

host.Run(); 

Chciałbym domyślną przeglądarkę internetową, aby automatycznie otwarte w celu uniknięcia nadmiarowego kroku użytkownik konieczności otwierania przeglądarki i ręcznie wprowadzić adres http://localhost:5000.

Jaki byłby najlepszy sposób, aby to osiągnąć? Dzwonienie pod numer Program.Start nie zadziała, ponieważ Run zablokuje wątek.

Odpowiedz

10

Masz dwie różne problemy tutaj:

wątku Blokowanie

host.Run() rzeczywiście blokuje główny wątek. Tak więc użyj host.Start() (lub await StartAsync na 2.x) zamiast host.Run().

Jak uruchomić przeglądarkę internetową

Jeśli używasz ASP.NET Rdzeń nad .NET Framework 4.x, Microsoft says można po prostu użyć:

Process.Start("http://localhost:5000"); 

Ale jeśli jesteś targetowanie wieloplatformowego .NET Core, powyższa linia zawiedzie. Nie ma jednego rozwiązania używającego .NET Standard, które działa na każdej platformie. Windows-jedynym rozwiązaniem jest:

System.Diagnostics.Process.Start("cmd", "/C start http://google.com"); 

Edit: I stworzył ticket oraz MS dev odpowiedział, że jako-of-dziś, jeśli chcesz multi wersję platformy należy zrobić to ręcznie, jak:

public static void OpenBrowser(string url) 
{ 
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 
    { 
     Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")); // Works ok on windows 
    } 
    else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) 
    { 
     Process.Start("xdg-open", url); // Works ok on linux 
    } 
    else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) 
    { 
     Process.Start("open", url); // Not tested 
    } 
    else 
    { 
     ... 
    } 
} 

Wszystko razem teraz:

using System.Threading; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Start(); 
     OpenBrowser("http://localhost:5000/"); 
    } 

    public static void OpenBrowser(string url) 
    { 
     if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 
     { 
      Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")); 
     } 
     else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) 
     { 
      Process.Start("xdg-open", url); 
     } 
     else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) 
     { 
      Process.Start("open", url); 
     } 
     else 
     { 
      // throw 
     } 
    } 
} 
1

Możesz odrodzić proces przeglądarki tuż przed host.Run(). To działa z Chrome i ewentualnie innych przeglądarek:

public static void Main(string[] args) 
{ 
    var host = new WebHostBuilder() 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .Build(); 

    var browserExecutable = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"; 
    Process.Start(browserExecutable, "http://localhost:5000"); 

    host.Run(); 
} 

W przypadku Chrome, nowe okno będzie czekać, aż serwer obraca się, a następnie połączyć i wyświetlić aplikację.

W zależności od konfiguracji systemu może być możliwe wykonanie Process.Start("http://localhost:5000"), aby uruchomić domyślną przeglądarkę zamiast kodowania ścieżki do pliku wykonywalnego. To nie zadziałało dla mnie z jakiegoś powodu. Można również wyciągnąć ścieżkę przeglądarki z rejestru lub z pliku konfiguracyjnego.

1

Jeszcze innym rozwiązaniem jest, aby rozwiązać IApplicationLifetime obiekt w Startup.Configure i zarejestruj telefon zwrotny pod numerem ApplicationStarted. To zdarzenie jest uruchamiane, gdy host się odwirował i nasłuchuje.

public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime) 
{ 
    appLifetime.ApplicationStarted.Register(() => OpenBrowser(
     app.ServerFeatures.Get<IServerAddressesFeature>().Addresses.First())); 
} 

private static void OpenBrowser(string url) 
{ 
    Process.Start(
     new ProcessStartInfo("cmd", $"/c start {url}") 
     { 
      CreateNoWindow = true 
     }); 
} 
Powiązane problemy