启动ASP.NET Core应用程序后如何启动Web浏览器?

时间:2016-07-25 20:26:57

标签: c# asp.net-core .net-core

我有一个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会阻止该线程。

4 个答案:

答案 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>