我有一个ASP.NET核心应用程序,将被多个用户用作客户端。换句话说,它不会托管在中央服务器上,只要需要使用应用程序,它们就会运行已发布的可执行文件。
在Program.cs
文件中,有以下内容:
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
我希望默认的网络浏览器能够自动打开,以避免用户必须打开浏览器并手动输入http://localhost:5000
地址的冗余步骤。
实现这一目标的最佳方法是什么?在致电Program.Start
后致电Run()
工作失败,因为Run
会阻止该线程。
答案 0 :(得分:14)
这里有两个不同的问题:
线程阻止
host.Run()
确实阻止了主线程。因此,使用host.Start()
(或2.x上的await StartAsync
代替host.Run()
。
如何启动网络浏览器
如果您在.NET Framework 4.x上使用ASP.NET Core,则可以使用Microsoft says:
Process.Start("http://localhost:5000");
但是,如果您的目标是多平台.NET Core,则上述行将失败。使用.NET Standard
的单一解决方案无法在每个平台上运行。仅限Windows的解决方案是:
System.Diagnostics.Process.Start("cmd", "/C start http://google.com");
编辑:我创建了一个ticket并且MS开发人员回答了今天的情况,如果您想要一个多平台版本,您应该手动执行,例如:
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 :(得分:1)
您可以在 private static final String Database_Name = "MyDBs.db";
之前生成网络浏览器流程。这适用于Chrome以及其他浏览器:
host.Run()
对于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();
}
启动默认浏览器,而不是硬编码可执行文件的路径。由于某种原因,这对我不起作用。您还可以将浏览器路径拉出注册表或从配置文件中删除。
答案 2 :(得分:1)
此处的另一个选择是解析IApplicationLifetime
中的Startup.Configure
对象并在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
});
}
答案 3 :(得分:1)
接受的答案很好,但是因为没有阻塞,所以程序将立即结束,从而停止服务器。这是根据Gerardo和Ivan的答案改编而成的版本。
它将创建服务器,在服务器开始侦听时启动浏览器,并阻塞直到服务器结束:
List<Details>