2016-07-25 10 views
9

Ich habe eine ASP.NET Core-Anwendung, die von mehreren Benutzern als Client verwendet wird. Mit anderen Worten, sie wird nicht auf einem zentralen Server gehostet und sie werden die veröffentlichte ausführbare Datei jederzeit ausführen, wenn sie die Anwendung verwenden müssen.Wie starte ich den Webbrowser, nachdem ich meine ASP.NET Core-Anwendung gestartet habe?

In der Program.cs Datei gibt es die folgenden:

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

host.Run(); 

Ich möchte den Standard-Web-Browser automatisch öffnen einen redundanten Schritt des Benutzers zu vermeiden, um den Browser zu öffnen und manuell in der http://localhost:5000 Adresse setzen.

Was wäre der beste Weg, dies zu erreichen? Der Aufruf von Program.Start nach dem Anruf an Run() funktioniert nicht, da Run den Thread blockiert.

Antwort

10

Sie haben zwei unterschiedliche Probleme hier:

Thema Blocking

host.Run() tatsächlich blockiert die Haupt-Thread. Verwenden Sie also host.Start() (oder await StartAsync auf 2.x) statt host.Run().

Wie die Web-Browser

beginnen Wenn Sie ASP.NET-Core über .NET Framework 4.x verwenden, Microsoft says können Sie nur verwenden:

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

Aber wenn Sie Targeting Multiplattform .NET Core, die obige Zeile wird fehlschlagen. Es gibt keine einzige Lösung mit .NET Standard, die auf jeder Plattform funktioniert. Die Windows-only Lösung ist:

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

Edit: Ich habe ticket erstellt und ein MS dev beantwortet, as-of-heute, wenn Sie eine Multi-Plattform-Version mögen, sollten Sie es manuell tun, wie:

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 
    { 
     ... 
    } 
} 

Alle zusammen jetzt:

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

Sie können den Webbrowser-Prozess direkt vor host.Run() spawnen. Dies funktioniert mit Chrome und möglicherweise andere Browser:

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(); 
} 

Im Fall von Chrome wird das neue Fenster warten, bis der Server dreht und dann anschließen und die Anwendung angezeigt werden soll.

Je nachdem, wie Ihr System konfiguriert ist, können Sie möglicherweise Process.Start("http://localhost:5000") starten, um den Standardbrowser zu starten, anstatt den Pfad zur ausführbaren Datei fest zu codieren. Aus irgendeinem Grund funktionierte das nicht für mich. Sie können den Browserpfad auch aus der Registrierung oder aus einer Konfigurationsdatei herausziehen.

1

Doch hier eine weitere Option ist ein IApplicationLifetime Objekt inlösenund registrieren Sie einen Rückruf unter ApplicationStarted. Dieses Ereignis wird ausgelöst, wenn ein Host hochgefahren ist und zuhört.

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