您有两个不同的问题:
线程阻塞
host.Run()
确实会阻塞主线程。所以,使用host.Start()
(或2.x上的await StartAsync
),而不是host.Run()
。
如何启动Web浏览器
如果您正在使用ASP.NET Core并且运行在.NET Framework 4.x上,Microsoft 说您可以只需使用:
Process.Start("http://localhost:5000");
但是如果你要针对多平台的.NET Core,上述代码将无法使用。因为没有任何一个使用.NET Standard
的解决方案可以在所有平台上工作。只有适用于Windows的解决方案:
System.Diagnostics.Process.Start("cmd", "/C start http://google.com");
编辑:我创建了一个问题单,微软的开发人员回答说,截至今日,如果你想要一个多平台版本,你需要手动完成,例如:
public static void OpenBrowser(string url)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); // 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(url) { UseShellExecute = true });
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("xdg-open", url);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Process.Start("open", url);
}
else
{
}
}
}
new ProcessStartInfo(url) { UseShellExecute = true }
实现该功能。 - Kyle DelaneyMain
方法的结尾添加host.WaitForShutdown();
以防止服务器立即关闭。 - mrmashal