2016-07-25 12 views
9

私は複数のユーザーによってクライアントとして使用されるASP.NETコアアプリケーションを持っています。つまり、中央サーバー上ではホストされず、アプリケーションを使用する必要があるときはいつでも、公開された実行可能ファイルが実行されます。 Program.csファイルでASP.NET Coreアプリケーションの起動後にWebブラウザを起動するにはどうすればよいですか?

次があります:

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

host.Run(); 

私が自動的に開いているブラウザを開いて、手動でhttp://localhost:5000アドレスに入れているユーザの冗長なステップを避けるために、デフォルトのWebブラウザをしたいと思います。

これを達成するにはどうすればよいでしょうか? Runがスレッドをブロックしているため、への呼び出し後にProgram.Startを呼び出すと機能しません。

答えて

10

あなたがここに二つの異なる問題を抱えて:

スレッドブロック確か

host.Run()ブロックメインスレッドを。したがって、host.Run()ではなく、host.Start()(または2.xではawait StartAsync)を使用してください。あなたがある場合

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

をしかし:あなたは、.NET Frameworkの4.xの上でASP.NETのコアを使用している場合は、Webブラウザ

を開始する方法

、マイクロソフトsaysあなただけ使用することができますマルチプラットフォームの.NETコアをターゲットにすると、上記の行は失敗します。すべてのプラットフォームで動作する.NET Standardを使用する単一のソリューションはありません。 Windowsのみのソリューションは、次のとおりです。

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

編集:私はticketを作成し、MS devのは次のように、あなたはマルチプラットフォームのバージョンをしたい場合など-の-今日、あなたは手動で行う必要があることを答えた:

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

すべて一緒に今

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

host.Run()の直前にWebブラウザプロセスを起動できます。これは、Chromeで動作し、おそらく他のブラウザ:クロームの場合

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

、新しいウィンドウには、サーバがスピンアップするまで待ってから、アプリケーションを接続して表示されます。

システムの構成によっては、Process.Start("http://localhost:5000")を実行して、実行可能ファイルへのパスをハードコーディングする代わりに、デフォルトのブラウザを起動することができます。これは何らかの理由で私にとってはうまくいかなかった。また、ブラウザのパスをレジストリから抜くか、設定ファイルから抜くことができます。

1

しかし、ここで別のオプションがにIApplicationLifetimeオブジェクトを解決することですに電話をかけ、ApplicationStartedにコールバックを登録してください。そのイベントは、ホストがスピンアップしてリスンしているときにトリガーされます。

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 
     }); 
} 
関連する問題