<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GenHTTP Webserver</title><link>https://genhttp.org/</link><description>Recent content on GenHTTP Webserver</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 01 Oct 2026 16:42:28 +0200</lastBuildDate><atom:link href="https://genhttp.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Internal</title><link>https://genhttp.org/documentation/server/engines/internal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/engines/internal/</guid><description>&lt;div class="cards"&gt;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Full/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Full&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Core/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Core&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This is the default HTTP implementation provided by the GenHTTP framework. It&#10;relies only on code written in C# and tries to reduce dependencies to third-party&#10;libraries and the environment it runs in as much as possible, therefore making it&#10;a good choice for embedding a webservice into another application (e.g. WPF or Windows Forms)&#10;or hosting a small service as a Docker container.&lt;/p&gt;</description></item><item><title>Request API</title><link>https://genhttp.org/documentation/content/concepts/request-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/request-api/</guid><description>&lt;h2 id="request-api"&gt;Request API&lt;a class="anchor" href="#request-api" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To handle incoming HTTP requests, GenHTTP uses the &lt;code&gt;IRequest&lt;/code&gt; abstraction, which - besides granting access to&#10;infrastructure components such as the &lt;code&gt;IServer&lt;/code&gt;, &lt;code&gt;IEndPoint&lt;/code&gt; or &lt;code&gt;IClientConnection&lt;/code&gt;, is intended to represent the data&#10;on the wire as it was received by the connected client.&lt;/p&gt;&#10;&lt;p&gt;The core entry points to handle requests are &lt;a href="../../handlers/"&gt;handlers&lt;/a&gt; and &lt;a href="../../concerns/"&gt;concerns&lt;/a&gt;. The server&#10;host is passed a handler instance (known as root handler) which is then responsible for handling all incoming requests.&#10;If needed, it can use other handlers to delegate work (see &lt;a href="../../handlers/layouting/"&gt;layouting&lt;/a&gt; as a starting point).&lt;/p&gt;</description></item><item><title>Routing</title><link>https://genhttp.org/documentation/content/concepts/routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/routing/</guid><description>&lt;p&gt;When the server receives a request from the client, it passes it to the root handler&#10;specified by your application. Depending on the requested path, this handler&#10;may invoke additional handlers to actually produce a response. The tree of handlers&#10;available in your application is called &lt;em&gt;handler chain&lt;/em&gt;. As requests are passed&#10;from one handler to another, they need to track, which segments of the requested&#10;path have already been considered and which still need to be evaluated,&#10;effectively decoupling them from each other. This&#10;capability is provided by the routing feature of the framework.&lt;/p&gt;</description></item><item><title>Upgrade to 10.x</title><link>https://genhttp.org/documentation/upgrades/v10/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/upgrades/v10/</guid><description>&lt;p&gt;This document is intended to guide you when upgrading from GenHTTP 9.x to GenHTTP 10.&lt;/p&gt;&#10;&lt;h3 id="dependency-injection"&gt;Dependency Injection&lt;a class="anchor" href="#dependency-injection" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In GenHTTP 10, support for dependency injection&#10;&lt;a href="../../content/concepts/dependency-injection/"&gt;has been added&lt;/a&gt;. If you are using&#10;custom mechanisms to achieve dependency injection, you might want to switch&#10;to the new, built-in way.&lt;/p&gt;&#10;&lt;h3 id="api-cleanup"&gt;API Cleanup&lt;a class="anchor" href="#api-cleanup" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The following types have been moved into their corresponding module&#10;packages as they are too specific to be part of the API.&lt;/p&gt;</description></item><item><title>Webservices</title><link>https://genhttp.org/documentation/content/frameworks/webservices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/webservices/</guid><description>&lt;p&gt;The webservice module provides an easy way to implement RESTful services&#10;that can be consumed by clients as needed.&lt;/p&gt;&#10;&lt;h2 id="hosting-an-api"&gt;Hosting an API&lt;a class="anchor" href="#hosting-an-api" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To host an API using this framework you can define a new class that&#10;hosts your operations as dedicated methods. The signature of those methods will&#10;define how your API can be called via HTTP.&lt;/p&gt;</description></item><item><title>Adapters</title><link>https://genhttp.org/documentation/server/adapters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/adapters/</guid><description>&lt;p&gt;GenHTTP is both a web server and a web application development framework. Adapters&#10;allow to re-use the functionality of the GenHTTP modules in other server frameworks&#10;such as ASP.NET Core.&lt;/p&gt;&#10;&lt;h2 id="aspnet-core"&gt;ASP.NET Core&lt;a class="anchor" href="#aspnet-core" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Adapters.AspNetCore/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Adapters.AspNetCore&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This adapter allows to plug in any GenHTTP handler into an existing ASP.NET Core application.&#10;The following example will use the &lt;a href="../../content/handlers/listing/"&gt;listing&lt;/a&gt; module to render a graphical&#10;file listing when accessing http://localhost:5000/files/ in the browser.&lt;/p&gt;</description></item><item><title>Functional Handlers</title><link>https://genhttp.org/documentation/content/frameworks/functional/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/functional/</guid><description>&lt;p&gt;With this module, requests can be handled in a functional manner, reducing&#10;the boilerplate code to be written by a web application developer.&lt;/p&gt;&#10;&lt;h2 id="hosting-an-api"&gt;Hosting an API&lt;a class="anchor" href="#hosting-an-api" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To host an API using this framework you can create an &lt;code&gt;Inline&lt;/code&gt; handler and add&#10;your operations as needed.&lt;/p&gt;&#10;&lt;div class="code-block"&gt;&#10; &lt;div class="code-bar"&gt;&#10; &lt;span class="code-lang"&gt;C#&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" data-copy aria-label="Copy the code" hidden&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect width="14" height="14" x="8" y="8" rx="2"/&gt;&lt;path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/&gt;&lt;/svg&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M20 6 9 17l-5-5"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Engine.Internal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Modules.ApiBrowsing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Modules.Functional&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Modules.Layouting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Modules.OpenApi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;GenHTTP.Modules.Security&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bookService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Inline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// GET http://localhost:8080/books/?page=1&amp;amp;pageSize=20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// GET http://localhost:8080/books/4711&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// PUT http://localhost:8080/books/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// POST http://localhost:8080/books/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// DELETE http://localhost:8080/books/4711&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;books&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bookService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CorsPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Permissive&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddOpenApi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// http://localhost:8080/openapi.json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddRedoc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// http://localhost:8080/redoc/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Development&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="further-resources"&gt;Further Resources&lt;a class="anchor" href="#further-resources" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The following capabilities are shared by various application frameworks:&lt;/p&gt;</description></item><item><title>Kestrel</title><link>https://genhttp.org/documentation/server/engines/kestrel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/engines/kestrel/</guid><description>&lt;div class="cards"&gt;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Full.Kestrel/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Full.Kestrel&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Core.Kestrel/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Core.Kestrel&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Kestrel is a web server developed by Microsoft and the engine that runs ASP.NET applications.&#10;As it is maintained by Microsoft, this engine is a good choice when you have&#10;high performance and security requirements.&lt;/p&gt;</description></item><item><title>Method Definitions</title><link>https://genhttp.org/documentation/content/concepts/definitions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/definitions/</guid><description>&lt;p&gt;All API frameworks share a common base provided by the &lt;code&gt;Reflection&lt;/code&gt; and &lt;code&gt;Conversion&lt;/code&gt; modules which&#10;define some of the capabilities that can be used when defining an API method&#10;signature.&lt;/p&gt;&#10;&lt;h2 id="injection"&gt;Injection&lt;a class="anchor" href="#injection" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This section describes how parameters of your methods are initialized and which&#10;kind of types can be used.&lt;/p&gt;&#10;&lt;h3 id="primitives"&gt;Primitives&lt;a class="anchor" href="#primitives" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;By default, a parameter type can be used within a method definition if it is either &lt;code&gt;string&lt;/code&gt;,&#10;&lt;code&gt;bool&lt;/code&gt;, an &lt;code&gt;enum&lt;/code&gt;, one of &lt;code&gt;DateTime&lt;/code&gt;, &lt;code&gt;DateTimeOffset&lt;/code&gt;, &lt;code&gt;DateOnly&lt;/code&gt;, &lt;code&gt;TimeOnly&lt;/code&gt; or &lt;code&gt;TimeSpan&lt;/code&gt;, or&#10;implements &lt;code&gt;IUtf8SpanFormattable&lt;/code&gt; (which covers the numeric primitives such as &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt; or&#10;&lt;code&gt;Guid&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Upgrade to 11.x</title><link>https://genhttp.org/documentation/upgrades/v11/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/upgrades/v11/</guid><description>&lt;p&gt;This document is intended to guide you when upgrading from GenHTTP 10.x to GenHTTP 11.&lt;/p&gt;&#10;&lt;h3 id="target-frameworks"&gt;Target Frameworks&lt;a class="anchor" href="#target-frameworks" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This version is shipped with the release of .NET 11. Following the support policy&#10;from Microsoft, support for .NET 8 and 9 has been dropped.&lt;/p&gt;&#10;&lt;h3 id="packaging"&gt;Packaging&lt;a class="anchor" href="#packaging" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In previous versions, you would reference both &lt;code&gt;GenHTTP.Core&lt;/code&gt; as well as any module&#10;you wanted to use within your application. While this is still recommended for deployments,&#10;you can now use the &lt;code&gt;GenHTTP.Full&lt;/code&gt; package (which also exist for Kestrel and Ioxide)&#10;which bundles all available modules for convenience.&lt;/p&gt;</description></item><item><title>Code Generation</title><link>https://genhttp.org/documentation/content/concepts/code-generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/code-generation/</guid><description>&lt;p&gt;By default, the server compiles a delegate for each webservice method that fetches the input&#10;arguments from the request, executes the method, and maps the result into an HTTP response -&#10;this is faster than analyzing and invoking the method via the reflection APIs on every request.&#10;The delegate is compiled once, during &lt;code&gt;PrepareAsync&lt;/code&gt; (i.e. server start), so it does not add any&#10;latency to the first request handled by the endpoint.&lt;/p&gt;</description></item><item><title>Controllers</title><link>https://genhttp.org/documentation/content/frameworks/controllers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/controllers/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Controllers/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Controllers&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This framework allows to create APIs by defining and implementing controller classes. In contrast&#10;to ASP.NET, you cannot use this framework to dynamically render HTML pages in an MVC style project,&#10;so this is just another flavor of defining a web API.&lt;/p&gt;</description></item><item><title>ioxide</title><link>https://genhttp.org/documentation/server/engines/ioxide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/engines/ioxide/</guid><description>&lt;div class="cards"&gt;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Full.Ioxide/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Full.Ioxide&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10; &lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Core.Ioxide/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Core.Ioxide&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="callout callout-warning" role="note" aria-label="Warning"&gt;&#10; &lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/&gt;&lt;path d="M12 9v4M12 17h.01"/&gt;&lt;/svg&gt;&#10; &lt;div class="callout-body"&gt;&lt;p&gt;As ioxide depends on &lt;code&gt;io_uring&lt;/code&gt; which is a capability of the Linux kernel, it cannot&#10;run on other platforms, such as Windows or macOS. Kernel version 6.1 or higher is required.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Logging</title><link>https://genhttp.org/documentation/server/logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/logging/</guid><description>&lt;p&gt;GenHTTP uses the &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logging/overview" rel="noopener"&gt;default logging mechanism&lt;/a&gt;&#10;of .NET Core and allows to create loggers via the &lt;code&gt;IServer&lt;/code&gt; interface. By default,&#10;the host will add a console logger.&lt;/p&gt;&#10;&lt;h2 id="logging-information"&gt;Logging Information&lt;a class="anchor" href="#logging-information" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The following code shows to obtain a logger from the server instance in&#10;a custom &lt;code&gt;IHandler&lt;/code&gt; implementation. It is recommended to create the logger&#10;once in the preparation phase and store the reference somewhere. You can use&#10;this pattern anywhere where you have access to &lt;code&gt;IServer&lt;/code&gt; (e.g. via &lt;code&gt;request.Server&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Websockets</title><link>https://genhttp.org/documentation/content/frameworks/websockets/</link><pubDate>Thu, 11 Dec 2025 00:27:41 +0200</pubDate><guid>https://genhttp.org/documentation/content/frameworks/websockets/</guid><description>&lt;p&gt;Websockets allow to create a bidirectional connection between your clients and your server,&#10;allowing both sides to push content without the need of sending HTTP requests.&lt;/p&gt;&#10;&lt;h2 id="flavors"&gt;Flavors&lt;a class="anchor" href="#flavors" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There are three different flavors that you can use to host a web socket endpoint. They do not differ in functionality. In this section we will spawn&#10;a simple websocket server that will relay incoming messages to all other connected clients&#10;(so basically a simple chat application). In the &amp;ldquo;Client&amp;rdquo; section you will find a simple&#10;HTML file that can be opened in a browser to connect to your server.&lt;/p&gt;</description></item><item><title>Endpoints and Ports</title><link>https://genhttp.org/documentation/server/endpoints/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/endpoints/</guid><description>&lt;p&gt;By default, the server will listen on port 8080 for incoming IPv4 or IPv6 connections on&#10;any interface. To simply change the port the server will listen on, you can use&#10;the &lt;code&gt;Port()&lt;/code&gt; directive of the host. Please note, that hosting a server on ports below 1024&#10;will require additional permissions on some operating systems.&lt;/p&gt;&#10;&lt;div class="code-block"&gt;&#10; &lt;div class="code-bar"&gt;&#10; &lt;span class="code-lang"&gt;C#&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" data-copy aria-label="Copy the code" hidden&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect width="14" height="14" x="8" y="8" rx="2"/&gt;&lt;path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/&gt;&lt;/svg&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M20 6 9 17l-5-5"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;To configure the server to listen on specific interfaces only, you can &lt;code&gt;Bind()&lt;/code&gt; those&#10;endpoints explicitly.&lt;/p&gt;</description></item><item><title>Response Content</title><link>https://genhttp.org/documentation/content/concepts/response-content/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/response-content/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.IO/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.IO&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;When sending content in response to a client request, &lt;code&gt;IResponseBuilder&lt;/code&gt; has a single entry point for it:&#10;&lt;code&gt;Content(IResponseContent? content)&lt;/code&gt;. Everything about the content itself - its &lt;code&gt;Length&lt;/code&gt;, &lt;code&gt;Type&lt;/code&gt; and&#10;encoding - is a property of the &lt;code&gt;IResponseContent&lt;/code&gt; implementation being passed in, not something configured&#10;separately on the builder. &lt;code&gt;Length&lt;/code&gt; is the number of bytes the content will produce; if it is not known,&#10;chunked transfer encoding is applied.&lt;/p&gt;</description></item><item><title>Resources</title><link>https://genhttp.org/documentation/content/concepts/resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/resources/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.IO/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.IO&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;GenHTTP provides a thin abstraction layer to control access of binary resources&#10;(such as files or blobs). This allows to re-use file-dependent handlers, independent from&#10;whether the data comes from the file system, a database or somewhere else.&lt;/p&gt;</description></item><item><title>Security</title><link>https://genhttp.org/documentation/server/security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/server/security/</guid><description>&lt;p&gt;This page summarizes security considerations and configuration options&#10;when running GenHTTP applications.&lt;/p&gt;&#10;&lt;h2 id="general-considerations"&gt;General Considerations&lt;a class="anchor" href="#general-considerations" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GenHTTP is designed to be used as an application server behind a reverse proxy, and therefore does not provide built-in DoS protection (such as IP connection limits or Slowloris prevention).&#10;However, compared to many other web service frameworks for C#, it is hardened against - and explicitly&#10;&lt;a href="https://www.http-probe.com/servers/genhttp.html" rel="noopener"&gt;tested for&lt;/a&gt; - typical attack vectors such as request smuggling, header injection, or malformed chunk attacks.&lt;/p&gt;</description></item><item><title>Single Page Applications (SPA)</title><link>https://genhttp.org/documentation/content/frameworks/single-page-applications/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/single-page-applications/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.SinglePageApplications/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.SinglePageApplications&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This handler provides an easy way to serve a single page application (for example a&#10;Vue.js, React, or Angular app) to your clients.&lt;/p&gt;</description></item><item><title>Dependency Injection</title><link>https://genhttp.org/documentation/content/concepts/dependency-injection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concepts/dependency-injection/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.DependencyInjection/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.DependencyInjection&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This optional module allows to use Microsoft&amp;rsquo;s abstraction layer to inject dependencies into handlers,&#10;concerns and framework classes as well as their methods.&lt;/p&gt;</description></item><item><title>Static Websites</title><link>https://genhttp.org/documentation/content/frameworks/static-websites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/static-websites/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.StaticWebsites/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.StaticWebsites&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This handler provides an easy way to serve a static website such as a &lt;a href="https://gohugo.io/" rel="noopener"&gt;Hugo&lt;/a&gt;&#10;application to your clients.&lt;/p&gt;</description></item><item><title>Custom Frameworks</title><link>https://genhttp.org/documentation/content/frameworks/custom/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/frameworks/custom/</guid><description>&lt;p&gt;The framework layer of GenHTTP allows application frameworks (such as webservices or controllers) to host a set&#10;of operations (put simply a route with a piece of C# code to be executed). This way the application framework&#10;itself is only a very thin layer - it analyzes the given scope (such as a controller class) and derives operations&#10;from it which are then handled by the generic framework part. This way, all application frameworks share&#10;the same feature level and can support things like parameter binding, serialization, async execution&#10;or code generation. To give an example, the webservice handler which provides the whole webservice framework&#10;consists of 70 lines of code only - everything else is done by the underlying framework layer.&lt;/p&gt;</description></item><item><title>Features</title><link>https://genhttp.org/features/</link><pubDate>Tue, 01 Sep 2026 09:35:41 +0200</pubDate><guid>https://genhttp.org/features/</guid><description>&lt;h2 id="frameworks"&gt;Frameworks&lt;a class="anchor" href="#frameworks" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GenHTTP provides several frameworks to develop and host web services (e.g. service classes, controller-style or functional-style).&#10;Additionally, you can easily host static websites or a single page app. Besides this, the framework&#10;comes with a rich set of features:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Automatically generated Open API specifications&lt;/li&gt;&#10;&lt;li&gt;Various authentication methods (e.g. API key, JWT, Client Certificates or Basic Auth)&lt;/li&gt;&#10;&lt;li&gt;Support for Websockets and Server Sent Events (SSE)&lt;/li&gt;&#10;&lt;li&gt;Automatic response compression and request decompression&lt;/li&gt;&#10;&lt;li&gt;Client caching directives and automatic eTag handling&lt;/li&gt;&#10;&lt;li&gt;Range support to fetch byte ranges&lt;/li&gt;&#10;&lt;li&gt;Security relevant features (such as automatic redirection to HTTPS)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="server-performance"&gt;Server Performance&lt;a class="anchor" href="#server-performance" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;According to &lt;a href="https://www.http-arena.com" rel="noopener"&gt;HTTP Arena&lt;/a&gt;, GenHTTP is currently the fastest web server for HTTP/1.1. The following&#10;excerpt shows how GenHTTP compares to other C# servers in the field:&lt;/p&gt;</description></item><item><title>Support</title><link>https://genhttp.org/support/</link><pubDate>Tue, 02 Dec 2025 17:10:41 +0200</pubDate><guid>https://genhttp.org/support/</guid><description>&lt;h2 id="getting-support"&gt;Getting Support&lt;a class="anchor" href="#getting-support" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you have questions or run into issues while building applications with the GenHTTP webserver framework,&#10;our community is here to help. You can reach us through:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/Kaliumhexacyanoferrat/GenHTTP" rel="noopener"&gt;GitHub&lt;/a&gt; discussions and issue tracking&lt;/li&gt;&#10;&lt;li&gt;Our community &lt;a href="https://discord.gg/PRkwKrnrB4" rel="noopener"&gt;Discord channel&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Both platforms are actively monitored and are great places to get guidance, report problems,&#10;or exchange ideas with other GenHTTP users.&lt;/p&gt;</description></item><item><title>Legal</title><link>https://genhttp.org/legal/</link><pubDate>Thu, 20 Jun 2024 14:10:41 +0200</pubDate><guid>https://genhttp.org/legal/</guid><description>&lt;h2 id="imprint"&gt;Imprint&lt;a class="anchor" href="#imprint" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Andreas Nägeli&lt;/p&gt;&#10;&lt;p&gt;Kientzheimer Str. 1, 79238 Ehrenkirchen, Germany&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="mailto:solutions@genhttp.org"&gt;solutions@genhttp.org&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;If you would like to report a bug or ask a question, please visit &lt;a href="https://github.com/Kaliumhexacyanoferrat/GenHTTP/issues/new/choose" rel="noopener"&gt;our GitHub page&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="data-privacy"&gt;Data Privacy&lt;a class="anchor" href="#data-privacy" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This website is intended to provide information about the GenHTTP web server project. Personal data and cookies are not required for this, but&#10;your IP address is logged by the server for the purpose of technical operation with every request sent by your browser. This information will&#10;reside on the server until it is restarted. Besides this, no other personal data will be collected.&lt;/p&gt;</description></item><item><title>Links</title><link>https://genhttp.org/links/</link><pubDate>Thu, 20 Jun 2024 14:10:41 +0200</pubDate><guid>https://genhttp.org/links/</guid><description>&lt;h2 id="genhttp-gateway"&gt;GenHTTP Gateway&lt;a class="anchor" href="#genhttp-gateway" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The GenHTTP Gateway is an easy to configure reverse proxy provided as a docker&#10;image on &lt;a href="https://hub.docker.com/r/genhttp/gateway" rel="noopener"&gt;Docker Hub&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="./gateway.png" alt="GenHTTP Gateway in Portainer" width="500" height="362" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="mockh"&gt;MockH&lt;a class="anchor" href="#mockh" aria-label="Link to this section"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Small library based on the GenHTTP webserver allowing to mock HTTP responses for&#10;integration, component and acceptance tests of projects written in C# (or .NET in general).&#10;Available &lt;a href="https://github.com/Kaliumhexacyanoferrat/MockH" rel="noopener"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>API Browsing</title><link>https://genhttp.org/documentation/content/handlers/api-browsing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/api-browsing/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ApiBrowsing/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ApiBrowsing&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This module adds JavaScript based applications to visualize an Open API&#10;definition such as &lt;a href="https://swagger.io/tools/swagger-ui/" rel="noopener"&gt;Swagger UI&lt;/a&gt;,&#10;&lt;a href="https://redocly.com/" rel="noopener"&gt;Redoc&lt;/a&gt; or &lt;a href="https://scalar.com/" rel="noopener"&gt;Scalar&lt;/a&gt; to your app. All resources required by those&#10;apps are hosted locally so no internet connection is required.&lt;/p&gt;</description></item><item><title>Authentication</title><link>https://genhttp.org/documentation/content/concerns/authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/authentication/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Authentication/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Authentication&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The authentication module allows to restrict access to sections provided&#10;by handlers to authenticated users only. Independent from the kind of authentication&#10;used, the identified user can be read from the request in the following manner:&lt;/p&gt;</description></item><item><title>Client Caching (Policy)</title><link>https://genhttp.org/documentation/content/concerns/client-caching-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/client-caching-policy/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ClientCaching/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ClientCaching&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This concern allows to instruct clients to cache responses generated&#10;by the server for some duration by adding the &lt;code&gt;Expires&lt;/code&gt; HTTP header.&#10;The following example will cause the static website to be cached for one week:&lt;/p&gt;</description></item><item><title>Client Caching (Validation)</title><link>https://genhttp.org/documentation/content/concerns/client-caching-validation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/client-caching-validation/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ClientCaching/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ClientCaching&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This concern adds an &lt;code&gt;eTag&lt;/code&gt; header to every response generated by the server&#10;so that clients send a &lt;code&gt;If-None-Match&lt;/code&gt; header to validate their cache. If the&#10;content did not change on the server, the handler will generate a &lt;code&gt;304 Not Modified&lt;/code&gt;&#10;response, causing the client to re-use the locally cached data. This way, clients&#10;revisiting your web application load faster and the load on your server is reduced.&lt;/p&gt;</description></item><item><title>Compression</title><link>https://genhttp.org/documentation/content/concerns/compression/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/compression/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Compression/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Compression&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The compression concern compresses content sent to the clients, if applicable. By default,&#10;&lt;a href="https://www.gzip.org/" rel="noopener"&gt;gzip&lt;/a&gt;, &lt;a href="https://github.com/google/brotli" rel="noopener"&gt;Brotli&lt;/a&gt; and &lt;a href="https://github.com/facebook/zstd" rel="noopener"&gt;Zstandard&lt;/a&gt; (on .NET 11) are supported.&lt;/p&gt;</description></item><item><title>Content</title><link>https://genhttp.org/documentation/content/handlers/content/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/content/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.IO/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.IO&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This handler provides the content of a &lt;a href="../../concepts/resources/"&gt;resource&lt;/a&gt; such&#10;as a file or a text resource to a requesting client. In contrast&#10;to a &lt;a href="../files/#downloads"&gt;download&lt;/a&gt;, the handler does not instruct the&#10;client to download and store the file but just serves it.&lt;/p&gt;</description></item><item><title>CORS</title><link>https://genhttp.org/documentation/content/concerns/cors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/cors/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Security/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Security&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener"&gt;Cross-Origin Resource Sharing&lt;/a&gt; allows to control&#10;which resources browsers are allowed to access and how they are allowed to do so. For example, if you would like&#10;to access a webservice from a website hosted on another domain, the browser will&#10;send the &lt;code&gt;Origin&lt;/code&gt; header along with requests to the webservice and analyze the response to determine, whether the server&#10;allows clients to access the resource from this origin.&lt;/p&gt;</description></item><item><title>Decompression</title><link>https://genhttp.org/documentation/content/concerns/decompression/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/decompression/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Compression/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Compression&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This concern will analyze incoming requests for compressed content&#10;and will automatically decompress the body using a suitable decompression&#10;algorithm.&lt;/p&gt;</description></item><item><title>Defaults</title><link>https://genhttp.org/documentation/content/concerns/defaults/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/defaults/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Practices/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Practices&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The &lt;code&gt;Defaults()&lt;/code&gt; method provided by the practices&#10;module adds some useful concerns to your web server to enable features such as&#10;&lt;a href="../compression/"&gt;compression&lt;/a&gt; or &lt;a href="../client-caching-validation/"&gt;client side caching&lt;/a&gt;.&#10;This way, you will have a well configured server instance without the need&#10;of adding everything by yourself.&lt;/p&gt;</description></item><item><title>Directory Browsing</title><link>https://genhttp.org/documentation/content/handlers/listing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/listing/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.DirectoryBrowsing/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.DirectoryBrowsing&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The directory listing provider serves a simple web UI allowing users to browse directories&#10;and files read from a &lt;a href="../../concepts/resources/"&gt;resource tree&lt;/a&gt; below the specified path.&lt;/p&gt;</description></item><item><title>Error Handling</title><link>https://genhttp.org/documentation/content/concerns/error-handling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/error-handling/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ErrorHandling/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ErrorHandling&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;If an exception occurs while a request is handled, the server will render the&#10;exception into a structured response (JSON, XML, &amp;hellip; depending on what the client accepts) via&#10;&lt;code&gt;ErrorHandler.Default()&lt;/code&gt;, which is an alias for &lt;code&gt;ErrorHandler.Structured()&lt;/code&gt;. To customize the&#10;serialization used, pass a &lt;code&gt;SerializationBuilder&lt;/code&gt; to &lt;code&gt;Structured(...)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Files</title><link>https://genhttp.org/documentation/content/handlers/files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/files/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Files/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Files&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The Files module serves &lt;a href="../../concepts/resources/"&gt;resources&lt;/a&gt; to clients, either one at a time&#10;with a fixed path or as a whole browsable directory tree. The content type of a file is&#10;automatically determined by its extension unless overridden.&lt;/p&gt;</description></item><item><title>Hardening</title><link>https://genhttp.org/documentation/content/concerns/hardening/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/hardening/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Security/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Security&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Besides &lt;a href="../cors/"&gt;CORS&lt;/a&gt;, the security module provides a few concerns that harden a web&#10;application against common transport-level issues. All three are added automatically by&#10;&lt;a href="../defaults/"&gt;&lt;code&gt;Defaults()&lt;/code&gt;&lt;/a&gt; (with &lt;code&gt;preventSniffing&lt;/code&gt; off), or can be added together via&#10;&lt;code&gt;Harden()&lt;/code&gt; (which also enables &lt;code&gt;preventSniffing&lt;/code&gt; by default):&lt;/p&gt;</description></item><item><title>Inspection</title><link>https://genhttp.org/documentation/content/concerns/inspection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/inspection/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Inspection/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Inspection&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;When developing client applications, you will sometimes have trouble to understand, why you are getting a&#10;specific response from a webserver. The inspection concern allows you to add the query param &lt;code&gt;?inspect&lt;/code&gt; to any&#10;request and will respond with a detailed summary of how the received request looked like and what response&#10;was generated by the server.&lt;/p&gt;</description></item><item><title>Layouting</title><link>https://genhttp.org/documentation/content/handlers/layouting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/layouting/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Layouting/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Layouting&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Layouts are a basic mechanism that allows you to assemble your web application from&#10;different parts. They define which URLs are made available by the server and what&#10;the URL structure of your app will look like.&lt;/p&gt;</description></item><item><title>Liquid Pages</title><link>https://genhttp.org/documentation/content/handlers/liquid-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/liquid-pages/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/Kinetq.LiquidPages.GenHTTP/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;Kinetq.LiquidPages.GenHTTP&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/Kinetq.LiquidPages/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;Kinetq.LiquidPages&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="callout callout-info" role="note" aria-label="Note"&gt;&#10; &lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;circle cx="12" cy="12" r="10"/&gt;&lt;path d="M12 16v-4M12 8h.01"/&gt;&lt;/svg&gt;&#10; &lt;div class="callout-body"&gt;&lt;p&gt;This is a third-party integration maintained by &lt;a href="https://www.kinetq.com/" rel="noopener"&gt;Kinetq&lt;/a&gt;, not part of the&#10;GenHTTP project. Questions and issues regarding the package are best directed at its maintainers.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Load Balancer</title><link>https://genhttp.org/documentation/content/handlers/load-balancer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/load-balancer/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.LoadBalancing/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.LoadBalancing&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Allows to distribute incoming requests to multiple nodes, either by using&#10;a reverse proxy or by redirecting the client.&lt;/p&gt;</description></item><item><title>Localization</title><link>https://genhttp.org/documentation/content/concerns/localization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/localization/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.I18n/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.I18n&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The localization concern analyzes incoming requests for&#10;language preferences and allows the application logic to&#10;serve content based on those.&lt;/p&gt;</description></item><item><title>Open API</title><link>https://genhttp.org/documentation/content/concerns/open-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/open-api/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.OpenApi/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.OpenApi&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;This concern dynamically generates and serves an &lt;a href="https://github.com/OAI/OpenAPI-Specification" rel="noopener"&gt;Open API v3 specification&lt;/a&gt; using&#10;&lt;a href="https://github.com/RicoSuter/NSwag" rel="noopener"&gt;NSwag&lt;/a&gt; for all detected API endpoints.&lt;/p&gt;</description></item><item><title>Pages</title><link>https://genhttp.org/documentation/content/handlers/pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/pages/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Pages/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Pages&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The pages module allows the server to generate HTML pages (e.g. error messages or the directory listing) and can be&#10;used to render custom pages from a template, using &lt;a href="http://r3c.github.io/cottle/" rel="noopener"&gt;Cottle&lt;/a&gt; as a rendering engine. Support&#10;for rendering websites in GenHTTP is minimalistic, so you should not use this for a website project.&lt;/p&gt;</description></item><item><title>Range Support</title><link>https://genhttp.org/documentation/content/concerns/range-support/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/concerns/range-support/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.IO/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.IO&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Partial responses allow clients to fetch a specified portion of&#10;a requested resource which can be helpful for download managers&#10;to pause and resume downloads. As this functionality is not&#10;needed by every web application, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests" rel="noopener"&gt;range support&lt;/a&gt; is&#10;disabled by default.&lt;/p&gt;</description></item><item><title>Redirects</title><link>https://genhttp.org/documentation/content/handlers/redirects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/redirects/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.Redirects/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.Redirects&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The redirect provider allows to inform the client that the location of the actual resource&#10;is different than the requested URI.&lt;/p&gt;</description></item><item><title>Reverse Proxies</title><link>https://genhttp.org/documentation/content/handlers/reverse-proxy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/reverse-proxy/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ReverseProxy/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ReverseProxy&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The reverse proxy content provider allows to embed content from another&#10;web server into your application.&lt;/p&gt;</description></item><item><title>Server Sent Events (SSE)</title><link>https://genhttp.org/documentation/content/handlers/server-sent-events/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/server-sent-events/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.ServerSentEvents/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.ServerSentEvents&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;a href="https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events" rel="noopener"&gt;Server Sent Events (SSE)&lt;/a&gt; allow client applications such as&#10;browsers to subscribe to a stream of relevant events without the overhead added by the bi-directional connection&#10;of websockets. Therefore, they are useful whenever the server would like to notify the client about changes. This article&#10;describes how to host an event source in C# using the GenHTTP web server.&lt;/p&gt;</description></item><item><title>Virtual Hosts</title><link>https://genhttp.org/documentation/content/handlers/virtual-hosts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genhttp.org/documentation/content/handlers/virtual-hosts/</guid><description>&lt;div class="cards"&gt;&#13;&#10;&lt;a class="card card-icon" href="https://www.nuget.org/packages/GenHTTP.Modules.VirtualHosting/" rel="noopener"&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="m16.5 9.4-9-5.19"/&gt;&lt;path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/&gt;&lt;path d="M3.29 7 12 12l8.71-5M12 22V12"/&gt;&lt;/svg&gt;&lt;span class="card-title"&gt;GenHTTP.Modules.VirtualHosting&lt;/span&gt; &lt;span class="card-text"&gt;Package on NuGet&lt;/span&gt;&lt;svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M7 17 17 7M8 7h9v9"/&gt;&lt;/svg&gt;&lt;/a&gt;&#10;&#13;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The virtual host handler can be used to deliver different content&#10;depending on the host requested by the client. Note, that the&#10;handler can be used anywhere in the handler chain, but usually it is&#10;most beneficial as the main handler.&lt;/p&gt;</description></item></channel></rss>