ASP.NET Core 11 cheat sheet
The ASP.NET Core 11 bits worth bookmarking.
This pillar collects everything I’ve written about ASP.NET Core 11 - minimal APIs, OpenAPI, authentication, rate limiting, OpenTelemetry, Native AOT, the Kestrel/HTTP-3 work, and the Blazor rendering changes that landed in the .NET 11 cycle.
What to read first
Settle the architectural forks first: Minimal APIs vs controllers in ASP.NET Core 11 comes first, Blazor Server vs WebAssembly vs United in .NET 11 settles the UI hosting model, and gRPC vs REST vs SignalR picks the transport for service-to-service calls. To secure an API, JWT vs cookie authentication leads, then validating its issuer, audience, and lifetime covers the config people get wrong. For day-one surface, per-endpoint rate limiting and OpenAPI auth flows are what you’ll wire up first, and Scalar vs Swagger UI picks the docs renderer. On perf-sensitive paths, Native AOT with minimal APIs and Kestrel’s early HTTP/3 processing are the runtime wins.
For the request pipeline, endpoint filters vs middleware settles that fork; for caching, output caching vs response caching is the call, and Zstandard vs Brotli vs Gzip sets the compression default. For configuration, IOptions vs IOptionsSnapshot vs IOptionsMonitor decides which lifetime you inject, and WebApplicationFactory vs Testcontainers picks the integration-test harness. For background jobs, BackgroundService vs IHostedService vs Hangfire settles it. For observability, start with OpenTelemetry and Serilog and Seq.
What’s on this page
The list below auto-collects posts tagged with any of: aspnetcore, aspnet-core, aspnet. Newest first.
The companion .NET 11 tracker pillar collects the broader release; many posts overlap.
Index (93 posts)
2026 / 08
- ASP.NET Core Stops Turning 413 Into 500 in UseExceptionHandler
A PR merged into dotnet/aspnetcore main on August 19, 2026 makes ExceptionHandlerMiddleware honour BadHttpRequestException.StatusCode instead of overwriting it with 500.
- Fix: [FromForm] Dictionary<string, string> is always null in a minimal API
A [FromForm] Dictionary in a minimal API binds with an empty prefix: the form keys must be [key], not metadata[key]. Wrap it in a class to keep readable names.
- Fix: cannot target OpenAPI 3.0 after upgrading Swashbuckle.AspNetCore to v9
Swashbuckle 8 and later emit openapi 3.0.4, not 3.0.1, and there is no OpenApiSpecVersion for a patch version. Why it changed, and four ways to pin the string your tooling expects.
- Fix: Swagger UI shows Unable to render this definition after upgrading to .NET 11
ASP.NET Core 11 emits openapi 3.2.0 by default and Swagger UI below 10.1.5 rejects it. Upgrade Swashbuckle.AspNetCore.SwaggerUI, or pin OpenApiVersion back to OpenApi3_1.
- How to download a file from a Blazor component without JavaScript interop
Skip the downloadFileFromStream JS module entirely. Render an anchor with the download attribute pointing at a minimal API endpoint that returns TypedResults.File, or POST a plain HTML form with an AntiforgeryToken. Covers why the download attribute is what stops Blazor's enhanced navigation from swallowing the click, why data-enhance silently discards the file, and the cookie-vs-bearer auth trap.
- Scalar vs Swagger UI for OpenAPI documentation in ASP.NET Core 11
Scalar ships 1.02 MiB of gzipped JavaScript and a far better request builder. Swagger UI ships 514 KiB and renders OpenAPI 3.2, which is what .NET 11 now emits by default. Measured payloads, the 3.2 gap, endpoint routing on both sides, and the auth details that decide it.
- Zstandard vs Brotli vs Gzip response compression in .NET 11
Zstandard is the right default for dynamic API responses in .NET 11, but not at the quality the ASP.NET Core provider ships with. Benchmarks on real JSON payloads showing why quality 1 beats the default quality 3 on both size and CPU, when Brotli still wins, and why Gzip survives only as a fallback.
- Blazor Server Circuits Now Pause Themselves When the Tab Goes Idle
.NET 11 Preview 7 adds an opt-in package that pauses interactive Server circuits when the browser tab is hidden, freeing memory and SignalR connections held by users who are not actually there.
- Fix: 404 Not Found for blazor.server.js after installing a new .NET SDK
blazor.server.js 404s on .NET 10 because the script stopped being an embedded resource. Add RequiresAspNetWebAssets to the host project, or make sure it has a .razor file.
- Fix: The 'interceptors' feature is not enabled in this namespace
CS9137 comes from the Microsoft.AspNetCore.OpenApi source generator. Add InterceptorsNamespaces to every project that calls AddOpenApi, not just the one holding the PackageReference.
- Fix: The type or namespace name 'OpenApiReference' could not be found
OpenApiReference was deleted in Microsoft.OpenApi 2.0. Changing the using to Microsoft.OpenApi is not enough: replace each usage with a typed reference such as OpenApiSchemaReference.
- How to serve OpenAPI documentation with Scalar instead of Swagger UI in ASP.NET Core 11
Replace UseSwaggerUI with MapScalarApiReference in ASP.NET Core 11: routing, multiple documents, pre-filled auth, production gating, offline assets, and the Scalar-only OpenAPI extensions that mark endpoints stable or hidden.
- WebApplicationFactory vs Testcontainers for ASP.NET Core integration tests
They are not alternatives. WebApplicationFactory boots your app, Testcontainers boots your dependencies. Measured on .NET SDK 10.0.201: a container fixture costs 1.7 s per class against 10 ms for SQLite, and a HasMaxLength(16) violation that Postgres rejects with 22001 is silently accepted by SQLite.
- Fix: Attempting to reconnect to the server after a Blazor Server circuit disconnects
The reconnect modal means the SignalR circuit dropped, not that your app crashed. Decide whether the retry ended in failed or rejected, then fix sticky sessions, the 3-minute retention window, the 32 KB message limit, or persist circuit state with [PersistentState].
- gRPC vs REST vs SignalR for service-to-service calls in .NET 11
For internal service-to-service calls in .NET 11, default to gRPC when you own both ends of the contract and the call is point-to-point. Use REST with JSON when anything you do not control has to call the service. SignalR is not an RPC transport between services: reach for it only when one producer has to fan a message out to many long-lived consumers.
- Fix: HTTP Error 500.30 - ASP.NET Core app failed to start after deploying to IIS
500.30 means your app threw during startup inside w3wp.exe. The real exception is already in the Windows Application event log under IIS AspNetCore Module V2. Read that first, then rank the fix: missing shared framework, x86/x64 app pool mismatch, missing config, or app pool permissions.
- How to validate options at startup with IValidateOptions<T> in .NET 11
Implement IValidateOptions<T>, register it in DI, and chain ValidateOnStart so a bad appsettings.json kills the process instead of the first request that touches it. Covers the .NET 11 Validate<TValidator>() overload, async validation through IAsyncValidateOptions<T>, and the three places ValidateOnStart silently does nothing.
- How to configure Kestrel to serve HTTP/3 in ASP.NET Core 11
A complete guide to enabling HTTP/3 on Kestrel in ASP.NET Core 11: the HttpProtocols.Http1AndHttp2AndHttp3 endpoint config, MsQuic platform requirements on Windows, Linux, and macOS, why the first request is never HTTP/3, how to verify with HttpClient and middleware, QuicTransportOptions tuning, and the firewall and proxy gotchas that make it silently fall back.
- IOptions<T> vs IOptionsSnapshot<T> vs IOptionsMonitor<T> in .NET 11
Default to IOptions<T>. Use IOptionsMonitor<T> when a singleton has to see config reloads, and IOptionsSnapshot<T> only when a scoped consumer wants a value that is stable for one request. The deciding axis is the lifetime of the consumer, not the shape of the settings.
2026 / 07
- Fix: JavaScript interop calls cannot be issued at this time (Blazor prerendering)
Prerendering runs your component on the server with no browser attached, so IJSRuntime throws. Move the call into OnAfterRenderAsync, gate it on RendererInfo.IsInteractive, or disable prerendering.
- How to add Aspire to an existing ASP.NET Core solution without restructuring it
Add Aspire 13.4 to a brownfield ASP.NET Core solution by adding two new projects and three lines per service: aspire init, AppHost wiring with AddProject and WithReference, keeping your existing launchSettings.json and connection strings, and the resilience, health-endpoint, and proxy gotchas that bite on day one.
- How to write integration tests with WebApplicationFactory<T> in ASP.NET Core 11
A complete guide to WebApplicationFactory<TEntryPoint> in ASP.NET Core 11: making the Program entry point reachable, ConfigureTestServices vs ConfigureWebHost, replacing the EF Core registration through IDbContextOptionsConfiguration, the new ConfigureHostApplicationBuilder hook in .NET 11 preview 6, faking authentication, WebApplicationFactoryClientOptions, and UseKestrel when you need a real port.
- Endpoint filters vs middleware in ASP.NET Core 11: which should you use?
A decision guide for ASP.NET Core 11: middleware runs for every request before your handler binds, endpoint filters run only for the matched endpoint after binding and can see the typed arguments. Includes a feature matrix, when-to-pick-each scenarios, the ordering rules, and the gotchas that force the choice.
- SignalR clients can finally cancel a running hub method in .NET 11 Preview 6
Cancelling the CancellationToken you pass to InvokeAsync now reaches the server and cancels the hub method. This closes a SignalR request open since 2019.
- Typed results (Results<>) vs IResult vs IActionResult in ASP.NET Core 11
In ASP.NET Core 11, return Results<T1, TN> with TypedResults for minimal APIs and ActionResult<T> for controllers. Treat bare IResult and bare IActionResult as escape hatches: they compile for any response but describe nothing to OpenAPI, so you pay for them in hand-written ProducesResponseType attributes.
- WebApplication.CreateBuilder vs CreateSlimBuilder vs CreateEmptyBuilder in ASP.NET Core 11
Use CreateBuilder for a normal app, CreateSlimBuilder when you publish trimmed or Native AOT behind a TLS proxy, and CreateEmptyBuilder only when you want to register every service yourself. Here is the feature matrix and the gotchas that force the call.
- Output caching vs response caching in ASP.NET Core 11: which should you use?
Output caching is the right default for almost every server-side app in ASP.NET Core 11. Response caching only wins when your goal is to steer browser and proxy caches through HTTP headers. Here is the decision, with a feature matrix and the gotchas that force the call.
- Async validation lands in Minimal APIs with .NET 11 Preview 6
Preview 6 adds AsyncValidationAttribute and IAsyncValidatableObject so DataAnnotations rules can hit the database before your endpoint runs, without blocking a thread.
- How to add a health check endpoint to a minimal API in ASP.NET Core 11
A complete, working guide to health checks in an ASP.NET Core 11 minimal API: AddHealthChecks and MapHealthChecks, custom IHealthCheck classes returning Healthy/Degraded/Unhealthy, the AddDbContextCheck EF Core probe, tag-based liveness and readiness endpoints for Kubernetes, a JSON ResponseWriter, ResultStatusCodes, securing the endpoint with RequireAuthorization and RequireHost, and pushing results with IHealthCheckPublisher.
- How to add an endpoint filter to a minimal API in ASP.NET Core 11
A complete, working guide to endpoint filters in an ASP.NET Core 11 minimal API: AddEndpointFilter with an inline delegate, IEndpointFilter classes with DI, GetArgument and the Arguments list, short-circuiting with Results.Problem, FIFO/FILO ordering across multiple filters, group-level filters on MapGroup, and AddEndpointFilterFactory for signature-aware filters.
- ASP.NET Core 11 Preview 6 turns on automatic CSRF protection
Preview 6 rejects unsafe cross-origin browser requests by default, reading the Sec-Fetch-Site header instead of an antiforgery token. Here is what it blocks and how to opt out.
- Fix: "413 Request Entity Too Large" when uploading a file to an ASP.NET Core endpoint
Kestrel caps request bodies at 30,000,000 bytes by default and returns 413 when you exceed it. Raise MaxRequestBodySize globally, per endpoint, or in web.config behind IIS.
- Fix: System.InvalidOperationException: Headers are read-only, response has already started
You set a header, status code, or content type after the body was already flushed. Set all headers before the first write, or guard with HttpResponse.HasStarted and OnStarting.
- How to add response compression to an ASP.NET Core 11 API
A complete guide to response compression in ASP.NET Core 11: AddResponseCompression and UseResponseCompression, the new built-in Zstandard provider alongside Brotli and Gzip, compression levels, EnableForHttps and the CRIME/BREACH risk, custom MIME types, middleware ordering, and when to let the reverse proxy do it instead.
- How to return a typed Results<T1, T2> union from a minimal API endpoint in ASP.NET Core 11
Declare the handler's return type as Results<Ok<T>, NotFound> and return TypedResults.Ok / TypedResults.NotFound: the union gives compile-time checking that the handler only returns what it declares, and it self-describes to OpenAPI so you never write .Produces by hand. Covers async handlers, the six-type limit, and testing in ASP.NET Core 11.
- How to add output caching to a minimal API in ASP.NET Core 11
A complete, working guide to output caching in an ASP.NET Core 11 minimal API: AddOutputCache and UseOutputCache, CacheOutput on endpoints and MapGroup, named and base policies, Expire, VaryByQuery and VaryByHeader, tag-based eviction with EvictByTagAsync, cache stampede protection, ETag revalidation, and a Redis backing store.
- How to customize the OpenAPI document with AddOperationTransformer and AddSchemaTransformer in ASP.NET Core 11
A deep dive into the built-in OpenAPI transformer pipeline in .NET 11: operation vs schema transformers, the context objects, execution order, DI-activated transformers, and recipes for headers, responses, examples, and per-property tweaks.
- What is the IHostedService contract and when do I use it?
IHostedService is the two-method interface (StartAsync/StopAsync) the .NET generic host calls on startup and graceful shutdown. Here is exactly what the contract promises, when to implement it directly, and the .NET 10 and 11 behavior changes that catch people out.
- Migrate a minimal API from manual validation checks to built-in validation in ASP.NET Core 11
A step-by-step migration guide for replacing hand-rolled if-checks in ASP.NET Core 11 minimal API handlers with the built-in source-generated DataAnnotations validator: what breaks, which manual rules do and do not port, and how to verify the 400 ProblemDetails contract stays identical.
- Fix: "415 Unsupported Media Type" from a minimal API endpoint in ASP.NET Core 11
A minimal API returns 415 when the request Content-Type does not match what the endpoint binds. Send Content-Type: application/json for a body-bound type, or use [FromForm] for form and file uploads.
- How to customize minimal API validation error responses with IProblemDetailsService in ASP.NET Core 11
Call AddProblemDetails with a CustomizeProblemDetails callback to reshape the 400 that built-in minimal API validation returns in ASP.NET Core 11: add a traceId, rewrite the title, switch 400 to 422, or take full control with a custom IProblemDetailsWriter.
- How to set up JWT bearer authentication in a minimal API in ASP.NET Core 11
A complete, working setup for JWT bearer authentication in an ASP.NET Core 11 minimal API: install the package, wire up AddAuthentication().AddJwtBearer(), issue a token, protect endpoints with RequireAuthorization, add role and claim policies, and test the whole thing with dotnet user-jwts.
2026 / 06
- JWT vs cookie authentication in ASP.NET Core 11: which should you pick?
Use cookie authentication for any app where the browser is the only client, and reserve JWT bearer tokens for APIs called by mobile apps, other services, or third parties. Here is the full decision matrix.
- Fix: 405 Method Not Allowed instead of 401 with JWT bearer in ASP.NET Core
A protected endpoint returning 405 instead of 401 almost always means routing rejected the HTTP verb before auth ran, or a cookie scheme stole the challenge. Here is how to tell which.
- Why your ASP.NET Core JWT returns 401 even with a valid token
A valid token that still 401s almost always means the bearer handler never ran or ran under the wrong scheme. Check middleware order, the default scheme, the scheme name, and whether the header even reached the handler.
- How to register and resolve keyed services in .NET 11 dependency injection
Register more than one implementation of the same interface under a key with AddKeyedSingleton/Scoped/Transient, then resolve them with [FromKeyedServices], GetRequiredKeyedService, or KeyedService.AnyKey. The keyed and non-keyed registries are separate, which is the gotcha that bites most people.
- How to validate a JWT's issuer, audience, and lifetime in ASP.NET Core 11
A complete guide to TokenValidationParameters in ASP.NET Core 11: how ValidateIssuer, ValidateAudience, and ValidateLifetime work, what the defaults actually are, why Authority auto-configures the issuer and signing keys, the 5-minute ClockSkew trap, and how to read the IDX error codes when a valid-looking token is rejected.
- How to configure CORS for a JWT-protected API in ASP.NET Core 11
A complete guide to CORS for a bearer-token API in ASP.NET Core 11: the correct UseCors ordering relative to authentication, why a bearer token in the Authorization header is not a CORS credential, why AllowAnyHeader works but a manual wildcard does not cover Authorization, and how to keep preflight from failing.
- Blazor static SSR gets [SupplyParameterFromSession] in .NET 11 Preview 5
Reading session state in static server-rendered Blazor meant reaching into HttpContext.Session and serializing by hand. .NET 11 Preview 5 adds [SupplyParameterFromSession] so a component property binds to a session key directly.
- Minimal API validation vs FluentValidation in ASP.NET Core 11: which should you pick?
Use the built-in source-generated validation for synchronous, attribute-expressible rules in ASP.NET Core 11; reach for FluentValidation when you need async rules, complex cross-field logic, or validation kept out of your domain models.
- HybridCache vs IMemoryCache vs IDistributedCache in .NET 11: which should you pick?
Default to HybridCache for new caching code in .NET 11. Reach for IMemoryCache only when you need raw single-server speed with no serialization, and IDistributedCache only as a backing store. Here is the decision matrix.
- Fix: The antiforgery token could not be decrypted in ASP.NET Core
The error means Data Protection lost the key that signed the token. Persist keys to a shared, durable store and call SetApplicationName so every instance reads the same key ring.
- Blazor static SSR forms get client-side validation in .NET 11 Preview 5
Static server-rendered Blazor forms could only validate after a full POST round-trip. .NET 11 Preview 5 renders validation metadata so the Blazor JS enforces DataAnnotations rules in the browser, no circuit required.
- Fix: its render mode is not supported by the parent component's render mode (Blazor)
You put @rendermode on a child whose parent is already interactive. A subtree has exactly one render mode. Remove the child directive or move it to the boundary.
- How to persist state across the Blazor static-to-interactive render boundary in .NET 11
A prerendered Blazor component runs its initialization twice and loses state at the interactive handoff. Fix it with the [PersistentState] attribute or the PersistentComponentState service in .NET 11.
- How to expose OpenAPI without Swashbuckle in ASP.NET Core 11
Swashbuckle is gone from the ASP.NET Core templates. Here is how to generate and serve an OpenAPI document in .NET 11 with the built-in Microsoft.AspNetCore.OpenApi package: AddOpenApi, MapOpenApi, transformers, multiple documents, build-time generation, and a UI on top.
- How to organize minimal API endpoints with MapGroup in ASP.NET Core 11
A complete guide to structuring minimal APIs in ASP.NET Core 11 with MapGroup: per-resource endpoint modules as extension methods, nested groups, shared filters and auth, route-parameter prefixes, OpenAPI tags, and the filter-ordering rules that surprise people.
- How to use HybridCache in ASP.NET Core 11 with Redis as the L2 cache
Wire HybridCache to a Redis L2 in ASP.NET Core 11: register the service, add the StackExchange Redis distributed cache, and let GetOrCreateAsync give you a two-tier cache with built-in stampede protection and tag invalidation.
- How to validate request bodies in minimal APIs without controllers in ASP.NET Core 11
ASP.NET Core 11 has built-in validation for minimal APIs: call AddValidation, annotate your request record with DataAnnotations, and a source generator validates the bound model and returns 400 ProblemDetails before your handler runs. No controllers, no FluentValidation, no manual checks.
- Migrate a Blazor Server app to Blazor United (Blazor Web App) in .NET 11
A step-by-step checklist to move a standalone Blazor Server app to the unified Blazor Web App template on .NET 11, keeping every page on InteractiveServer with zero behaviour change.
- BackgroundService vs IHostedService vs Hangfire for background jobs in .NET 11
Pick BackgroundService for in-process loops, raw IHostedService when you need fine lifecycle control, and Hangfire when jobs must survive a restart. A decision matrix with code and the one gotcha that picks for you.
2026 / 05
- How to run fire-and-forget work safely in ASP.NET Core with BackgroundService
Calling Task.Run from a controller loses work on shutdown, swallows exceptions, and captures disposed scoped services. The safe pattern is a bounded Channel queue drained by a BackgroundService that opens a fresh scope per work item and drains in-flight work on StopAsync.
- How to use scoped services inside a BackgroundService in ASP.NET Core 11
A BackgroundService is a singleton, so it cannot inject a scoped service like a DbContext directly. Take IServiceScopeFactory, open one scope per unit of work with CreateAsyncScope, resolve inside it, and dispose it when the work is done.
- Migrate from .NET Framework 4.8 to .NET 11 in 2026
A version-pinned migration playbook for moving a .NET Framework 4.8 codebase to .NET 11 LTS in 2026, covering the SDK-style csproj rewrite, System.Web to ASP.NET Core, WCF, EF6 to EF Core 11, BinaryFormatter removal, AppDomain replacements, and a realistic rollback plan.
- Blazor Server vs Blazor WebAssembly vs Blazor United in .NET 11: which should you pick in 2026?
For any new Blazor app on .NET 11, scaffold a Blazor Web App (the template formerly nicknamed Blazor United) and pick render modes per page. Server-only and WebAssembly-only templates only still make sense in narrow cases.
- ASP.NET Core in .NET 11 Preview 4 Teaches OpenAPI About the HTTP QUERY Method
.NET 11 Preview 4 makes ASP.NET Core OpenAPI generation recognize HTTP QUERY as a first-class operation in OpenAPI 3.2, with a graceful fallback for 3.0 and 3.1 documents.
- Minimal APIs vs controllers in ASP.NET Core 11: which should you pick in 2026?
Pick minimal APIs by default in ASP.NET Core 11. Use controllers only when you need MVC features that minimal APIs still do not match: convention-based routing across many actions, MVC-style filters, or Razor views.
- Fix: InvalidOperationException: Synchronous operations are disallowed
Replace the Stream.Read or Write call with ReadAsync/WriteAsync. As a last resort, set AllowSynchronousIO on Kestrel, IIS, or per-request via IHttpBodyControlFeature.
- Fix: Cannot consume scoped service 'X' from singleton 'Y'
ASP.NET Core's scope validation throws this when a singleton would capture a scoped dependency for the rest of the process. Make the consumer scoped, or take IServiceScopeFactory and create a scope on demand.
- Fix: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core throws this when a constructor asks for a type that was never registered, was registered on the wrong container, or was added after the host was built. Three concrete fixes cover almost every case.
- Fix: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
If GetConnectionString returns null in .NET 11, your appsettings.json is missing the key, not copied to the build output, or the wrong environment file is being selected. Three checks fix 95% of cases.
- How to set up structured logging with Serilog and Seq in .NET 11
A complete guide to wiring Serilog 4.x and Seq 2025.2 into a .NET 11 ASP.NET Core app: AddSerilog vs UseSerilog, two-stage bootstrap logging, JSON configuration, enrichers, request logging, OpenTelemetry trace correlation, API keys, and the production gotchas around buffering, retention, and signal level.
- How to use OpenTelemetry with .NET 11 and a free backend
Wire OpenTelemetry traces, metrics, and logs into a .NET 11 ASP.NET Core app with the OTLP exporter, then ship them to a free, self-hosted backend: the standalone Aspire Dashboard for local dev, Jaeger and SigNoz for self-hosted production, and the OpenTelemetry Collector when you need both.
2026 / 04
- How to add per-endpoint rate limiting in ASP.NET Core 11
A complete guide to per-endpoint rate limiting in ASP.NET Core 11: when to pick fixed window vs sliding window vs token bucket vs concurrency, how RequireRateLimiting and [EnableRateLimiting] differ, partitioning by user or IP, the OnRejected handler, and the distributed deployment pitfall everyone hits.
- How to Call the Claude API from a .NET 11 Minimal API with Streaming
Stream Claude responses from an ASP.NET Core 11 minimal API end-to-end: the official Anthropic .NET SDK, TypedResults.ServerSentEvents, SseItem, IAsyncEnumerable, cancellation flow, and the gotchas that buffer your tokens silently. With Claude Sonnet 4.6 and Opus 4.7 examples.
- Asp.Versioning 10.0 finally plays nicely with built-in OpenAPI in .NET 10
Asp.Versioning 10.0 is the first release that targets .NET 10 and the new Microsoft.AspNetCore.OpenApi pipeline. Sander ten Brinke's April 23 walkthrough shows how to register one OpenAPI document per API version with WithDocumentPerVersion().
- How to add OpenAPI authentication flows to Swagger UI in .NET 11
In .NET 11 the OpenAPI document is generated by Microsoft.AspNetCore.OpenApi and Swagger UI is no longer in the template. Here is how to wire Bearer, OAuth2 with PKCE, and OpenID Connect so the Authorize button actually works.
- How to implement refresh tokens in ASP.NET Core Identity
Two working paths in .NET 11: the built-in MapIdentityApi /refresh endpoint, and a custom JWT setup with refresh token rotation, family tracking, and reuse detection.
- How to upload a large file with streaming to Azure Blob Storage
Upload multi-GB files to Azure Blob Storage from .NET 11 without loading them into memory. BlockBlobClient.UploadAsync with StorageTransferOptions, MultipartReader for ASP.NET Core uploads, and the buffering traps that put your payload on the LOH.
- How to use Native AOT with ASP.NET Core minimal APIs
A complete .NET 11 walkthrough for shipping an ASP.NET Core minimal API with Native AOT: PublishAot, CreateSlimBuilder, source-generated JSON, the AddControllers limitation, IL2026 / IL3050 warnings, and EnableRequestDelegateGenerator for library projects.
- How to add a global exception filter in ASP.NET Core 11
A complete guide to global exception handling in ASP.NET Core 11: why IExceptionFilter is the wrong tool, how IExceptionHandler and UseExceptionHandler work together, ProblemDetails responses, multi-handler chains, and the .NET 10 diagnostics suppression breaking change.
- How to Generate Strongly Typed Client Code from an OpenAPI Spec in .NET 11
Use Kiota, Microsoft's official OpenAPI code generator, to produce a fluent, strongly typed C# client from any OpenAPI spec. Step-by-step: install, generate, wire into ASP.NET Core DI, and handle authentication.
- How to stream a file from an ASP.NET Core endpoint without buffering
Serve large files from ASP.NET Core 11 without loading them into memory. Three tiers: PhysicalFileResult for on-disk files, Results.Stream for arbitrary streams, and Response.BodyWriter for generated payloads -- with code for each.
- .NET 10.0.7 Ships Out-of-Band to Fix CVE-2026-40372 in ASP.NET Core Data Protection
A HMAC validation flaw in Microsoft.AspNetCore.DataProtection 10.0.0 through 10.0.6 lets attackers forge ciphertexts. .NET 10.0.7 is the mandatory fix.
- Kestrel starts processing HTTP/3 requests before the SETTINGS frame in .NET 11 Preview 3
.NET 11 Preview 3 lets Kestrel serve HTTP/3 requests before the peer's control stream and SETTINGS frame arrive, shaving handshake latency off the first request on every new QUIC connection.
- Blazor Virtualize Finally Handles Variable-Height Items in .NET 11
ASP.NET Core in .NET 11 Preview 3 teaches the Virtualize component to measure items at runtime, fixing the spacing and scroll jitter that uniform-height assumptions caused.
- Blazor SSR Finally Gets TempData in .NET 11
ASP.NET Core in .NET 11 Preview 2 brings TempData to Blazor static server-side rendering, enabling flash messages and Post-Redirect-Get flows without workarounds.
- ASP.NET Core 11 Ships Native OpenTelemetry Tracing: Drop the Extra NuGet Package
ASP.NET Core in .NET 11 Preview 2 adds OpenTelemetry semantic attributes directly to HTTP server activity, removing the need for OpenTelemetry.Instrumentation.AspNetCore.
- Kestrel Drops Exceptions from Its HTTP/1.1 Parser in .NET 11
Kestrel's HTTP/1.1 request parser in .NET 11 replaces BadHttpRequestException with a result struct, cutting malformed-request overhead by up to 40%.
- dotnet new webworker: first-class Web Workers for Blazor in .NET 11 Preview 2
A new project template in .NET 11 Preview 2 scaffolds the JS plumbing, WebWorkerClient, and JSExport boilerplate needed to run .NET code in a browser Web Worker.
2026 / 01
- Scalar in ASP.NET Core: why your Bearer token is ignored (.NET 10)
If your Bearer token works in Postman but not in Scalar, the problem is likely your OpenAPI document. Here is how to declare a proper security scheme in .NET 10.
2023 / 06
- How to fix: dotnet ef not found (dotnet-ef does not exist)
Fix the 'dotnet-ef does not exist' / 'dotnet ef command not found' error by installing the EF Core CLI as a global or local .NET tool.
2020 / 12
- The specified version of Microsoft.NetCore.App or Microsoft.AspNetCore.App was not found.
Fix the 'Microsoft.NetCore.App or Microsoft.AspNetCore.App was not found' error by updating your Azure App Service stack and .NET runtime version.