您這裏有兩個不同的問題:
線程阻塞
host.Run()
的確塊主線程。因此,使用host.Start()
(或2.17上的await StartAsync
)而不是host.Run()
。
如何啓動網頁瀏覽器
如果是在.NET框架4.x中使用ASP.NET核心,微軟says你可以使用:
Process.Start("http://localhost:5000");
但如果你是針對多平臺的.NET Core,上述行將失敗。沒有單一的解決方案使用.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
}
}
}