【问题标题】:When it can be usefull to use the `IWebHost.Start()` method?什么时候可以使用 `IWebHost.Start()` 方法?
【发布时间】:2018-01-10 11:08:31
【问题描述】:

ASP.NET Core 2 MVC。

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

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

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

嗯...什么时候可以使用IWebHost.Start() 方法?

【问题讨论】:

  • 并非所有托管都只供用户通过 Internet 浏览网站,例如,您可能希望在 WPF 应用程序中添加托管,这样调用 Start 可能更合适。跨度>
  • @DavidG 好的,但在这种情况下,主机仍然存活不到一秒钟。它有什么用处?
  • 在 WPF 环境中,它会挂起。它在正常的Program.cs 中死掉的唯一原因是 exe 结束运行。在 Windows 应用程序(或服务)中,IWebHost 实例将一直存在直到关闭。
  • @DavidG 谢谢,现在我明白了。 :)

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


【解决方案1】:

并非所有托管都是在经典的互联网服务页面场景中执行的。例如,您可能希望从 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
    //...
}

【讨论】:

    【解决方案2】:

    当您在运行测试套件的同一进程中测试 Web 服务时,这很有用。

    举个例子,您只需查看 Microsoft 的 TestServer 实现即可。在其构造函数中,it is calling IWebHost.StartAsync() instead of Run()。这允许IWebHost 在您的测试套件对其运行请求时在非阻塞线程上运行,并在测试套件完成时处理TestServer

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

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2012-08-27
      • 2014-01-07
      • 2012-07-09
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多