What's New in ASP.NET Core 10: A Map
Objective
The "What's new in ASP.NET Core 10" page is long: it spans Blazor, Minimal APIs, OpenAPI, authentication, and a miscellaneous list of server changes. This concept is a map of that page. Each change gets a few lines here, and the ones that already have a full concept in this track link to it. Read it before an upgrade to know which areas to test, then follow the links for the details.
Everything below was checked against the official release notes page. What the page does not state is not claimed here.
Use Cases
- Planning an upgrade from .NET 9 and deciding which changes need a test pass.
- Finding the concept that explains a feature you saw in the release notes.
- Telling apart what is automatic (nothing to do) from what is opt-in (a call or a package) from what can break existing code.
- Onboarding someone who knows ASP.NET Core 9 and needs only the delta.
Deep Dive
Hosting and server
- Memory pool eviction. Kestrel, IIS and HTTP.sys memory pools now release
unused blocks when the app is idle or lightly loaded, with no configuration.
Metrics appear under the
Microsoft.AspNetCore.MemoryPoolmeter, and a built-inIMemoryPoolFactory<T>is available through DI. Full story inkestrel-iis-and-hosting-models. .localhosttop-level domain. Kestrel binds*.localhostnames to loopback, anddotnet new web --localhost-tlduses*.dev.localhostnames.- HTTP.sys security descriptor.
HttpSysOptions.RequestQueueSecurityDescriptorcustomizes who may access a newly created request queue. - PipeReader JSON. MVC, Minimal APIs and
ReadFromJsonAsyncuse a PipeReader-based JSON parser with no code change. Custom converters that ignoreUtf8JsonReader.HasValueSequencecan fail.
Minimal APIs and validation
- Built-in validation.
AddValidation()validates query, header and body data with data annotations, returns a 400 with details, and can be switched off per endpoint with.DisableValidation(). Records work like classes. The APIs moved to theMicrosoft.Extensions.Validationpackage, and failures can flow throughIProblemDetailsService. Seeinput-validation-in-minimal-apisandproblem-details-and-global-exception-handling. - Empty form strings. With
[FromForm]on a complex type, an empty string now binds tonullfor nullable value types such asDateOnly?. Binding rules live inparameter-binding-and-endpoint-filters. - Server-Sent Events.
TypedResults.ServerSentEventsstreams anIAsyncEnumerable<SseItem<T>>from Minimal APIs and controllers. No deep concept yet, so the official page is the source. - JSON Patch on System.Text.Json. A new implementation ships in the
Microsoft.AspNetCore.JsonPatch.SystemTextJsonpackage. The page says it is not a drop-in replacement (no dynamic types such asExpandoObject) and does not mitigate the security risks inherent to the JSON Patch standard. RedirectHttpResult.IsLocalUrl(url). A helper that tells whether a URL is local, meant to guard redirects against open redirection.- Testing apps with top-level statements. A source generator now emits
public partial class Programwhen you did not write it, and an analyzer flags the explicit declaration.
OpenAPI
- OpenAPI 3.1 is now the generated version,
Microsoft.OpenApimoves to 2.0, YAML is served by a.yamlor.ymlroute suffix, XML doc comments feed the document,Produces*attributes acceptDescription, and transformers can be endpoint specific. Transformers written for 3.0 need updating. All of it is inopenapi-document-generation.
Blazor
- Forms validation.
DataAnnotationsValidatornow handles nested objects and collection items, afterAddValidation()and a[ValidatableType]root. Seeblazor-forms-editform-and-validation. - Not Found.
NavigationManager.NotFound, theRouterparameterNotFoundPage, and no more<NotFound>render fragment. Seeblazor-routing-layouts-and-navigation. - Declarative state.
[PersistentState]replaces manualPersistentComponentStatecode across prerendering, and circuit state can survive long disconnections. Prerendering context is inblazor-data-access-and-streaming-rendering. - Smaller items.
QuickGridgainedRowClassandHideColumnOptionsAsync,InputHiddenis new, JS interop gainedInvokeConstructorAsync,GetValueAsyncandSetValueAsync, and the Blazor script is a fingerprinted static web asset. Hosting choices stay inblazor-render-modes-and-hosting-models.
Identity and observability
- Passkeys. ASP.NET Core Identity supports WebAuthn passkeys, and the Blazor Web App template includes them.
- Metrics. New authentication, authorization and Identity metrics, plus Blazor metrics and tracing.
- API-friendly cookies. For endpoints marked with
IApiEndpointMetadata, cookie authentication returns 401 or 403 instead of a redirect. - Exception diagnostics.
ExceptionHandlerOptions.SuppressDiagnosticsCallbackcontrols logging for exceptions anIExceptionHandleralready handled.
Trade-offs
- A map is not a recipe. Three to six lines say that a feature exists, not how it fails. For anything marked with a link, read the deep concept before you adopt it.
- Automatic is not free. Memory eviction and PipeReader JSON need no code,
yet both can change behavior under load or with unusual converters, so load
test an upgrade even when nothing in your code changes. Opt-in features cost
one call, and that call is easy to forget.csharp
builder.Services.AddValidation(); // without it, annotations are not enforced - Breaking changes hide inside feature lists. The page lists changes such
as Blazor WebAssembly
HttpClientresponse streaming on by default and the<NotFound>fragment no longer supported. Read each Blazor and OpenAPI item as a possible migration task, not only as a gain. - Some features have no concept here yet. SSE, JSON Patch,
IsLocalUrl, passkeys and the metrics are only described. Treat the official page as the source and verify against a running app before you rely on them. - Release notes age. The page is tied to the .NET 10 release. Later releases can change defaults, so recheck the page for your exact version.