Miroslav Holec
Premium

Zapojení in-process hosting modelu v ASP.NET Core

Miroslav Holec   8. srpna 2019

Článek se vztahuje k verzi produktu ASP.NET Core 2.1

Tento článek je již velmi zastaralý. Článek nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

Pakliže vaše aplikace běží na webovém serveru s IIS, můžete od verze ASP.NET Core 2.2 využít nový model hostování aplikací označený jako in-process hosting. Oproti dosavadnímu out-of-process modelu dostanete z aplikací trochu více výkonu, který se jinak ztratí komunikací mezi dvěma web servery.

Princip fungování In-Process hosting modelu

Zatímco v případě klasického ASP.NET Core out-of-process hosting modelu se všechny webové requesty forwardují z externího webového serveru na interní (typicky z IIS na Kestrel), v případě nového in-process modelu se vaše webová aplikace zahostuje v rámci IIS procesu (bez Kestrelu). Protože spolu webové servery nemusí komunikovat, vzniká tu trochu prostoru pro lepší výkonnost. ASP.NET Core modul v tomto případě použije dotnet muxer, načte se Core CLR a provede se statická metoda Main() v assembly, která je předaná dotnet driveru. Zpracování requestu řídí HTTP.sys driver a ten následně nechá request vyřešit vaší aplikací - proteče HTTP middleware pipelinou.

Zapnutí režimu in-process

Při zakládání nových ASP.NET Core aplikací se již používá šablona, která aplikaci připravuje na režim in-proces. To lze poznat z nastavení csproj souboru. V rámci publikace se nastavení csproj souboru reflektuje do web.config a dává tak ASP.NET Core modulu vědět, jak má s aplikací komunikovat. Ve web.config se bude nacházet nastavení hostingModel="InProcess" Podotýkám, že in-process režim je momentálně podporován pouze zmíněným ASP.NET Core Modulem V2 (a ten lze nainstalovat pouze na IIS server).

Integrace je automaticky zapojena v rámci Program.cs voláním

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)

a pokud není potřeba dodatečná konfigurace, stačí skutečně jen přítomnost řádků:

<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

Dodatečné poznámky

Po přechodu na režim in-process:

  • není bráno v potaz nastavení Kestrelu (nepoužívá se),
  • může některé nastavení Kestrelu způsobit selhání při startu aplikace (502 error), zejména je nutné volat UseKestrel() před UseIISIntegration()
  • nelze sdílet mezi aplikacemi aplikační pool (pool je vždy jen pro jednu aplikaci)

V rámci běhu na lokálním prostředí spuštěním aplikace (dotnet driverem) spouštíte klasicky nadále Kestrel. Je třeba si tedy hlídat, aby lokální prostředí nevykazovalo odlišné chování v důsledku konfigurace Kestrelu.

To je celé základní nastavení. V souvislosti s přechodem na in-process hosting se dále řeší nastavení autentizace, forwarding hlaviček a další věci. Záleží ale na konkrétním scénáři. V případě potíží není nic snazšího, než mi napsat.

Zda vše správně funguje lze ověřit sledováním response hlaviček. Jednou z nich je hlavička Server, která by nyní měla být hodnotu například Microsoft-IIS/8.5, zatímco v případě klasického out-of-process modelu bude hodnota Kestrel.