Wann kann es sinnvoll sein, die Methode `IWebHost.Start()` zu verwenden?

Wann kann es sinnvoll sein, die Methode `IWebHost.Start()` zu verwenden?

Nicht das gesamte Hosting wird in einem klassischen Szenario zum Bereitstellen von Seiten über das Internet durchgeführt. Beispielsweise möchten Sie möglicherweise Inhalte aus Ihrer WPF-App oder einem Windows-Dienst bereitstellen. In dieser Situation möchten Sie wahrscheinlich nicht, dass der Anruf blockiert wird – Ihre App muss andere Dinge tun. Nehmen wir zum Beispiel an, Sie haben eine WPF-App und möchten Inhalte daraus bedienen. Sie könnten einfach den main erweitern Methode:

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
    //...
}

Dies ist nützlich, wenn Sie Ihren Webdienst in demselben Prozess testen, der die Testsuite ausführt.

Als Beispiel müssen Sie nicht weiter als bis zu TestServer von Microsoft suchen Implementierung. Innerhalb seines Konstruktors ruft es IWebHost.StartAsync() auf statt Run() . Dies ermöglicht die IWebHost um auf einem nicht blockierenden Thread ausgeführt zu werden, während Ihre Testsuite Anforderungen dafür ausführt, wobei der TestServer verworfen wird wenn die Testsuite abgeschlossen ist.

Dies kann auch explizit für End-to-End-Tests aufgerufen werden, bei denen Ihr Dienst Anfragen indirekt von einem anderen Dienst erhält. Ich habe beispielsweise einen Dienst, der Nachrichten von Google Cloud PubSub überträgt. In meiner Testsuite rufe ich also Start() auf auf der Kapselung IWebHost meines Dienstes , senden Sie eine Nachricht an den Pubsub-Emulator, der in einem Docker-Container ausgeführt wird, und der meinen Testhost aufruft. Ich vergewissere mich, dass der Testhost wie erwartet Anfragen erhalten hat, und fahre dann den Testhost herunter.