什么时候使用`IWebHost.Start()`方法有用呢?

时间:2018-01-10 11:08:31

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

ASP.NET Core 2 MVC。

Microsift.AspNet.Hosting.IWebHost界面contains Start()方法。此外,Microsoft.AspNetCore.Hosting.WebHostExtensionsdefines Run()接口的IWebHost扩展方法。

Run()方法运行Web应用程序并阻塞调用线程,直到主机关闭。

同时Start()方法在主机关闭之前不会阻塞调用线程。在这种情况下,浏览器会在向用户显示信息之前关闭。

嗯...什么时候使用IWebHost.Start()方法很有用?

2 个答案:

答案 0 :(得分:7)

并非所有托管都是在经典的互联网服务页面中执行的。例如,您可能希望从WPF应用程序或Windows服务提供内容。在这种情况下,您可能不希望调用阻止 - 您的应用程序将有其他事情要做。例如,假设您有一个WPF应用,并且您想要从中提供内容,您可以简单地扩展main方法:

private IWebHost _webHost;

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    //Create the host
    _webHost = WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

    //We want to start, not run because we need the rest of the app to run
    _webHost.Start();

    //Run the app as normal
    Application.Run(new MainForm());

    //We're back from the app now, we can stop the host
    //...
}

答案 1 :(得分:1)

当您以与运行测试套件相同的过程来测试Web服务时,这很有用。

举个例子,除了微软的TestServer实现之外,您不需要再做其他任何事情。在其构造函数it is calling IWebHost.StartAsync() instead of Run()中。这样,IWebHost可以在测试套件对其运行请求时在非阻塞线程上运行,并在测试套件完成后处置TestServer

对于端到端测试,当您的服务从另一个服务间接获取请求时,也可以显式调用此方法。例如,我有一项服务,用于推送来自Google Cloud PubSub的消息。因此,在测试套件中,我在服务的封装Start()上调用IWebHost,向运行在Docker容器中的the pubsub emulator发送一条消息,然后调用了测试主机。我确认测试主机收到了预期的请求,然后关闭了测试主机。