ioxide.httpclient 0.3.100

There is a newer version of this package available.
See the version list below for details.
dotnet add package ioxide.httpclient --version 0.3.100
                    
NuGet\Install-Package ioxide.httpclient -Version 0.3.100
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ioxide.httpclient" Version="0.3.100" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ioxide.httpclient" Version="0.3.100" />
                    
Directory.Packages.props
<PackageReference Include="ioxide.httpclient" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ioxide.httpclient --version 0.3.100
                    
#r "nuget: ioxide.httpclient, 0.3.100"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ioxide.httpclient@0.3.100
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ioxide.httpclient&version=0.3.100
                    
Install as a Cake Addin
#tool nuget:?package=ioxide.httpclient&version=0.3.100
                    
Install as a Cake Tool

ioxide ioxide.httpclient ioxide.pg ioxide.redis ioxide.file ioxide.tls ioxide.Kestrel ioxide.ngtcp2 ioxide.nghttp3

A shared-nothing io_uring runtime for .NET.

One ring per reactor thread - run one per core. Each reactor owns its ring, its SO_REUSEPORT listener, its connections and its clients outright: nothing is shared, so nothing is locked. HTTP, Postgres, Redis and file I/O all submit on the owning ring and resume inline on the same thread. No thread pool on the hot path. No native dependencies - raw syscalls, nothing else.

Linux 6.1+ · .NET 10 / .NET 11 · status 0.2.6 - experimental

Documentation - architecture, guides, and every example below as runnable code you can read side by side.

First-class async/await

Shared-nothing runtimes usually ask you to give up the platform's async model. ioxide keeps it: handlers are ordinary async Task code, and await works everywhere.

  • Ring completions resume their continuations inline on the reactor thread - an awaited recv, query or file read picks up exactly where it left off, with no thread pool hop.
  • A per-reactor SynchronizationContext catches everything that would otherwise escape: timers, HttpClient, Task.Run results - their continuations post back to the owning reactor.
  • Ring operations await through reusable, allocation-free awaitables.

You always wake up on your reactor. That is what makes shared-nothing practical in .NET: connection, pool and handler state stays single-threaded without a lock in sight.

Clients ride the same ring

Every client is opened from the reactor's start hook, which runs on the reactor thread - so the connections it makes belong to that reactor's ring. The handler fetches it back as a reactor service. There is one pool per reactor and no sharing between them, which is why none of it needs a lock.

That holds for a Postgres query, a Redis command, an outbound HTTP call and a positional file read alike: each is submitted on the ring that accepted the request and resumes on the same thread, so a request never leaves the core it arrived on. A reverse proxy built this way keeps both hops - inbound connection and outbound call - on one thread for the life of the request.

Scope

ioxide hands you raw bytes and stays out of HTTP. Request parsing and response bytes are your code; the runtime owns the ring, the connections and the clients. When you want a framework on top, ioxide.Kestrel swaps the transport under an existing ASP.NET Core app - one ring per core, with Kestrel's request loop pinned to the reactor thread, and your endpoints unchanged.

Packages

Package What it does
ioxide The runtime: reactors, TCP/UDP transports, connections, the ring-native client seam.
ioxide.http11 HTTP message types and the ring-native HTTP/1.1 client. No native dependencies.
ioxide.nghttp2 HTTP/2 + HPACK (nghttp2), bundled native. Sans-I/O - bytes ride any ioxide connection.
ioxide.ngtcp2 QUIC engine: ngtcp2 + picotls bundled native. Only system dependency is OpenSSL 3.
ioxide.nghttp3 HTTP/3 + QPACK (nghttp3), bundled native. Rides any QUIC connection.
ioxide.http3 Pure-C# HTTP/3: frames, QPACK, Huffman. Zero native code, drop-in for ioxide.nghttp3.
ioxide.tls TLS. OpenSSL handshake over the ring, then kTLS - handlers keep writing plaintext.
ioxide.httpclient One HTTP client per origin over 1.1 / h2c / h3, chosen per origin via Alt-Svc.
ioxide.pg Postgres driver. A pool per reactor; connect, query and stream rows on the owning ring.
ioxide.redis Redis client. RESP2, pipelining, pub/sub - pooled per reactor.
ioxide.file Static assets. Immutable snapshots, baked responses, positional ring reads.
ioxide.Kestrel ASP.NET Core transport: UseIoxide() and Kestrel runs one ring per core.

Where the code is

Nothing here is pseudocode. Every pattern above exists as something you can run:

What you get
Documentation The examples browser - TCP, QUIC, HTTP/3, every client, and the ASP.NET drop-in, side by side.
Playground One project per workload. Each Program.cs is a complete server - config, reactors, threads, handler - so you can copy the file out and run it.
Examples The raw, pg, redis, file and tls variants plus a quic-h3 mode, with benchmark results.
Examples.AspNet UseIoxide() measured against a stock Kestrel baseline.
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed.  net11.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.4.178 0 8/10/2026
0.4.177 0 8/10/2026
0.4.176 0 8/10/2026
0.4.169 33 8/9/2026
0.4.168 35 8/9/2026
0.4.167 36 8/9/2026
0.4.165 41 8/9/2026
0.4.163 48 8/8/2026
0.4.162 33 8/8/2026
0.4.161 43 8/8/2026
0.4.156 41 8/8/2026
0.4.153 39 8/7/2026
0.4.152 41 8/7/2026
0.3.149 53 8/7/2026
0.3.145 56 8/5/2026
0.3.100 40 8/5/2026
0.2.6 47 8/4/2026
0.2.5 44 8/4/2026