ioxide.httpclient 0.3.145

There is a newer version of this package available.
See the version list below for details.
dotnet add package ioxide.httpclient --version 0.3.145
                    
NuGet\Install-Package ioxide.httpclient -Version 0.3.145
                    
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.145" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ioxide.httpclient" Version="0.3.145" />
                    
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.145
                    
#r "nuget: ioxide.httpclient, 0.3.145"
                    
#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.145
                    
#: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.145
                    
Install as a Cake Addin
#tool nuget:?package=ioxide.httpclient&version=0.3.145
                    
Install as a Cake Tool

ioxide ioxide.httpclient ioxide.pg ioxide.redis ioxide.file 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, and TLS termination (OpenSSL handshake over the ring, then kTLS - handlers keep writing plaintext).
ioxide.httpclient The ring-native HTTP client: HTTP/1.1, HTTP/2 (h2c) and HTTP/3 behind one API, Alt-Svc negotiation, one set of message types. Bundles the nghttp2 native.
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.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.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 7 8/10/2026
0.4.176 31 8/10/2026
0.4.169 38 8/9/2026
0.4.168 38 8/9/2026
0.4.167 38 8/9/2026
0.4.165 42 8/9/2026
0.4.163 49 8/8/2026
0.4.162 35 8/8/2026
0.4.161 45 8/8/2026
0.4.156 42 8/8/2026
0.4.153 40 8/7/2026
0.4.152 42 8/7/2026
0.3.149 54 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