{"id":672,"date":"2026-08-21T23:20:35","date_gmt":"2026-08-21T23:20:35","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/?p=672"},"modified":"2026-08-21T23:20:35","modified_gmt":"2026-08-21T23:20:35","slug":"iis-vs-kestrel-web-server","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/","title":{"rendered":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting"},"content":{"rendered":"<p class=\"wp-block-paragraph\">IIS vs Kestrel is a common question when hosting ASP.NET Core on Windows, and the honest answer is that the two servers are not rivals &#8211; they are layers. Kestrel is the cross-platform HTTP server built into ASP.NET Core; IIS is the full Windows web server that normally sits in front of Kestrel and hands requests to it. Understanding which layer does what tells you when to use one, the other, or both.<\/p>\n\n<h2 class=\"wp-block-heading\">What each one actually is<\/h2>\n\n<ul class=\"wp-block-list\"><li>Kestrel: an in-process HTTP server library for ASP.NET Core. It is cross-platform, ships with the framework, and is what dotnet new webapp runs by default. No management UI, no modules &#8211; it is a library, not a product.<\/li><li>IIS: the Windows web server with request filtering, URL rewrite, compression, Windows authentication, application pools, and a management console. It hosts ASP.NET Core through the AspNetCoreModule (in-process or out-of-process), which runs Kestrel underneath either way.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">In the in-process hosting model, IIS loads the app directly into the application pool worker and Kestrel still exists inside the process &#8211; it is how ASP.NET Core speaks HTTP. So on a typical Windows deployment you are using both, with IIS as the front door.<\/p>\n\n<h2 class=\"wp-block-heading\">Performance: what the numbers say<\/h2>\n\n<p class=\"wp-block-paragraph\">Kestrel is fast: it consistently posts some of the highest raw throughput numbers among managed web servers, and on Windows the in-process IIS model adds almost no overhead because requests never leave the worker process. The out-of-process model (Kestrel as a separate process behind IIS via loopback) adds one extra hop and is measurably slower, which is why in-process is the default since ASP.NET Core 2.2. For static files, IIS serves them directly from the StaticFileModule without touching managed code; Kestrel uses the StaticFiles middleware. Both are fast; IIS wins marginally on static content because it can skip the managed pipeline entirely.<\/p>\n\n<p class=\"wp-block-paragraph\">Raw benchmark numbers depend heavily on workload, hardware, and TLS configuration, so treat any headline figure with suspicion. The practical rule: on Windows, an in-process IIS deployment performs comparably to standalone Kestrel for typical web apps, while giving you IIS features for free.<\/p>\n\n<h2 class=\"wp-block-heading\">How the in-process model works<\/h2>\n\n<p class=\"wp-block-paragraph\">When you publish an ASP.NET Core app to IIS with hostingModel set to inprocess, the AspNetCoreModuleV2 loads the application into the w3wp.exe worker process of its application pool. Requests arrive at HTTP.sys, pass through the IIS module pipeline (authentication, URL rewrite, compression, request filtering), and then execute inside the app pool worker &#8211; no second process, no loopback hop. Kestrel still exists inside that process; it is the HTTP server the framework uses. The relevant web.config line:<\/p>\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Out-of-process hosting runs dotnet.exe as a separate process and IIS proxies to it over a loopback socket. It provides process isolation between IIS and the app &#8211; a crash in the app does not take down the worker &#8211; at the cost of one extra hop per request. Choose in-process for performance and simplicity; choose out-of-process only if you specifically want the app isolated from the worker process.<\/p>\n\n<h2 class=\"wp-block-heading\">Feature comparison<\/h2>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Capability<\/th><th>Kestrel (standalone)<\/th><th>IIS (full)<\/th><\/tr><\/thead><tbody><tr><td>TLS termination<\/td><td>Configured in app code (UseHttps)<\/td><td>Bindings + certificate management UI<\/td><\/tr><tr><td>HTTP\/2 \/ HTTP\/3<\/td><td>HTTP\/2 yes; HTTP\/3 experimental<\/td><td>HTTP\/2 yes; HTTP\/3 on Windows Server 2022+<\/td><\/tr><tr><td>Request filtering<\/td><td>Manual middleware<\/td><td>Request Filtering module (URL, verbs, sizes, extensions)<\/td><\/tr><tr><td>URL rewriting<\/td><td>Middleware or reverse-proxy rules<\/td><td>URL Rewrite module<\/td><\/tr><tr><td>Windows auth (Kerberos\/NTLM)<\/td><td>Not built-in<\/td><td>Native, integrated with AD<\/td><\/tr><tr><td>Process isolation<\/td><td>OS-level only<\/td><td>Application pools with recycling and crash isolation<\/td><\/tr><tr><td>Diagnostics<\/td><td>Logging middleware, dotnet tools<\/td><td>Failed Request Tracing, App Pool logs<\/td><\/tr><tr><td>Management<\/td><td>None (config files)<\/td><td>IIS Manager + Web Deploy<\/td><\/tr><tr><td>Multi-server load balancing<\/td><td>Manual \/ external LB<\/td><td>ARR extension for server farms<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<h2 class=\"wp-block-heading\">When to run Kestrel directly<\/h2>\n\n<ul class=\"wp-block-list\"><li>Containers and multi-platform deployments where IIS is not available.<\/li><li>Small internal services or microservices that sit behind a gateway, reverse proxy, or load balancer.<\/li><li>Development environments where dotnet run is the fastest path.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Running Kestrel directly on Windows Server means giving up request filtering, Windows authentication, app pool isolation, and IIS diagnostics. It is rarely the right call for a public-facing site on Windows.<\/p>\n\n<h2 class=\"wp-block-heading\">When to put IIS in front<\/h2>\n\n<ul class=\"wp-block-list\"><li>Any public web application on Windows Server where you want HTTPS binding management, Windows auth, or request filtering.<\/li><li>Multiple apps on one server that need isolation &#8211; application pools contain crashes and recycle independently.<\/li><li>Teams that rely on IIS Manager, Web Deploy, or Failed Request Tracing for operations.<\/li><\/ul>\n\n<h2 class=\"wp-block-heading\">Decision summary<\/h2>\n\n<ul class=\"wp-block-list\"><li>Public site on a Windows VPS: IIS in front, in-process hosting model. You get Kestrel performance plus IIS management.<\/li><li>Container or multi-platform app: Kestrel, with an external proxy for TLS and routing.<\/li><li>Internal tool with one or two users: Kestrel as a Windows Service is fine, but IIS adds isolation and logging for almost no effort.<\/li><li>Need both worlds: run IIS with the ASP.NET Core Module &#8211; that is the standard reverse-proxy arrangement on Windows.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">The IIS-versus-Kestrel debate is really about where you want your operational features: in the framework or in the server. On Windows hosting, IIS plus in-process Kestrel is the default that loses nothing and gains management, filtering, and authentication. If you are comparing hosts for your next deployment, <a href=\"https:\/\/windows-vps.org\/#providers\">compare Windows VPS plans on our table<\/a>, and <a href=\"https:\/\/windows-vps.org\">check our main comparison<\/a> for Windows Server VPS providers that pre-install IIS and let you manage it directly.<\/p>\n\n<p class=\"wp-block-paragraph\">Want to experiment with both servers on your own hardware? <a href=\"https:\/\/www.anrdoezrs.net\/click-101539688-17162719?sid=windowsvps\" rel=\"noreferrer noopener sponsored\" target=\"_blank\">Contabo&#8217;s Windows VPS plans<\/a> offer generous RAM and core counts for the price, which makes side-by-side IIS and Kestrel testing painless.<\/p>","protected":false},"excerpt":{"rendered":"<p>IIS vs Kestrel is a common question when hosting ASP.NET Core on Windows, and the honest answer is that the two servers are not rivals &#8211; they are layers. Kestrel is the cross-platform HTTP server built into ASP.NET Core; IIS is the full Windows web server that normally sits in front of Kestrel and hands &#8230; <a title=\"IIS vs Kestrel: Choosing a Web Server for Windows Hosting\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\" aria-label=\"Read more about IIS vs Kestrel: Choosing a Web Server for Windows Hosting\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-672","post","type-post","status-publish","format-standard","hentry","category-comparisons"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>IIS vs Kestrel: Choosing a Web Server for Windows Hosting - Windows VPS Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IIS vs Kestrel: Choosing a Web Server for Windows Hosting\" \/>\n<meta property=\"og:description\" content=\"IIS vs Kestrel: Choosing a Web Server for Windows Hosting\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T23:20:35+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\",\"name\":\"IIS vs Kestrel: Choosing a Web Server for Windows Hosting - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-08-21T23:20:35+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IIS vs Kestrel: Choosing a Web Server for Windows Hosting\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting - Windows VPS Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/","og_locale":"en_US","og_type":"article","og_title":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting","og_description":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting","og_url":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-08-21T23:20:35+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_misc":{"Written by":"windows-vps","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/","url":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/","name":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-08-21T23:20:35+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/iis-vs-kestrel-web-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"IIS vs Kestrel: Choosing a Web Server for Windows Hosting"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=672"}],"version-history":[{"count":3,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/672\/revisions"}],"predecessor-version":[{"id":685,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/672\/revisions\/685"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}