Zapojení in-process hosting modelu v ASP.NET Core
Článek se vztahuje k verzi produktu ASP.NET Core 2.1
Tento článek byl napsán v roce 2019. Vývojářské technologie se neustále inovují a článek již 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
.