.NET 11 for Devs, Part 3: Endpoint Short-Circuiting and the Move to CoreCLR on Android
.NET 11 for Devs, Part 3: Endpoint Short-Circuiting and CoreCLR on Android
This is the third instalment in our “.NET 11 for devs” series. So far we’ve dug into Runtime Async, C# 15’s extension indexers and union types, and collection expression arguments. This time we’re looking at two features from the current Preview 6 build (shipped July 2026) that sit at opposite ends of the stack: a small ASP.NET Core convenience that pays off at scale, and a much larger runtime shift that’s been quietly grinding forward for a couple of release cycles.
For context on timelines: .NET 11 is on track for general availability on November 10, 2026, and it’s a Standard Term Support (STS) release — so 18 months of support rather than the three years you get from an LTS. Plan your upgrade cadence accordingly.
1. ASP.NET Core endpoint short-circuiting
Every request that hits an ASP.NET Core app walks through the middleware pipeline. Authentication, authorization, CORS, response compression, logging middleware — each of them runs in order, does its work, and hands off to the next. That’s fine for the routes that actually need all of it. It’s wasted effort for the ones that don’t.
The classic example is a health check endpoint. Your load balancer hammers /healthz every few seconds. There’s no reason for that request to pass through auth, CORS negotiation, response compression, or any request-logging middleware you’ve bolted on. But by default, it does — because those live earlier in the pipeline.
Preview 6 introduces endpoint short-circuiting: an attribute (and matching route builder method) that terminates the pipeline as soon as routing has matched the endpoint, skipping everything downstream. The endpoint’s own handler still runs — you just don’t pay for the middleware that would otherwise sit between routing and execution.
The config
On a minimal API route, use ShortCircuit():
app.MapGet("/healthz", () => Results.Ok("healthy"))
.ShortCircuit();
You can optionally pass a status code to return immediately without even invoking the handler — handy for blocking noisy routes outright:
// Return 404 straight from routing, no handler, no middleware
app.MapGet("/robots-old.txt", () => { })
.ShortCircuit(404);
For controller-based apps, the attribute form applies at the action or controller level:
[HttpGet("/status")]
[ShortCircuit]
public IActionResult Status() => Ok(new { status = "up" });
Why it matters
- Performance for hot, dumb routes. Health checks, ping endpoints, and static-like responses get served without dragging the full pipeline along. On high-traffic services where a probe fires constantly, that’s real CPU you get back.
- Simpler reasoning. When you mark an endpoint as short-circuiting, you’re making an explicit statement: nothing between routing and this handler runs. That removes a whole class of “which middleware touched this response and why” debugging.
- Predictable behaviour. No accidental compression on a tiny payload, no auth challenge on a public probe, no logging spam from a route you never cared about.
One thing to be deliberate about: short-circuiting skips middleware that runs after routing, so anything you genuinely need on that route — CORS headers, for instance — won’t be applied. Use it on endpoints where you know the full pipeline is overkill, not as a blanket optimisation.
2. CoreCLR on Android (and progressing for Blazor/WebAssembly)
This is the bigger story, and it’s been building for a while. Historically, .NET on Android has run on the Mono runtime, while your server and desktop code runs on CoreCLR. Two runtimes, two sets of behaviours, two performance profiles, two places for a subtle difference to bite you. If you’ve ever hit a bug that reproduced on device but not in your unit tests, runtime divergence is a plausible culprit.
In .NET 11, the work to run CoreCLR on Android continues to progress — the goal being that .NET MAUI apps and shared cross-platform libraries run on the same runtime everywhere: server, desktop, and mobile.
What you actually get
- Consistency across platforms. The same JIT, GC, and runtime semantics on Android as on your backend. Fewer “works on the server, misbehaves on device” surprises, and a smaller mental model to hold.
- Startup and throughput. CoreCLR brings its mature tiered compilation and codegen story to mobile, which is where the runtime team is targeting startup and performance wins as the work matures.
- One toolchain to reason about. Diagnostics, profiling, and runtime knobs converge rather than forking per-platform.
Where it actually is right now
Be clear-eyed about the state: this is early-stage. As of the current preview, the initial SDK plumbing and native interop are in place, which is enough to build and run basic scenarios on CoreCLR. But the pieces that make it production-grade are still landing — RyuJIT and WASI support are targeted for the end of the .NET 11 cycle, not the start. Treat it as something to experiment with and validate against your app, not something to migrate your production mobile build to on day one of GA.
The same runtime-unification effort is progressing on the Blazor/WebAssembly side. The end state is the same one CoreCLR-on-Android is chasing: your WASM code running on the same runtime foundation as everything else, rather than a separate Mono-based path. Again — in flight, not finished, so watch the release notes as later previews ship.
Why this matters for your day-to-day
Endpoint short-circuiting is the kind of feature you can adopt immediately: tag your health checks and probe routes, shave off middleware you never needed there, and get a cleaner pipeline mental model for free. It’s small, but it’s the sort of small that adds up on a busy service.
The CoreCLR-on-Android shift is a longer game. You won’t rebuild your MAUI app around it this week, but it’s worth tracking closely — because a single runtime across every platform is exactly the kind of change that quietly eliminates a category of cross-platform bugs and inconsistencies you’ve been working around for years. Keep an eye on the later Preview drops as RyuJIT and WASI support come online before the November 10 GA.