ASP.NET Core 2 MVC。
Microsift.AspNet.Hosting.IWebHost
界面contains Start()
方法。此外,Microsoft.AspNetCore.Hosting.WebHostExtensions
类defines Run()
接口的IWebHost
扩展方法。
Run()
方法运行Web应用程序并阻塞调用线程,直到主机关闭。
同时Start()
方法在主机关闭之前不会阻塞调用线程。在这种情况下,浏览器会在向用户显示信息之前关闭。
嗯...什么时候使用IWebHost.Start()
方法很有用?
答案 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发送一条消息,然后调用了测试主机。我确认测试主机收到了预期的请求,然后关闭了测试主机。