[release-notes] ASP.NET Core in .NET 11 Preview 4#10389
[release-notes] ASP.NET Core in .NET 11 Preview 4#10389danroth27 wants to merge 12 commits intorelease-notes/11.0-preview4from
Conversation
Live-tested every feature against the installed 11.0.100-preview.4.26224.122 build with reflection + sample apps: * Resolve TLS TODO: confirm ITlsHandshakeFeature.Exception property name. * OpenAPI file results: note .Produces<FileContentHttpResult>() annotation is required for the binary schema to appear (PR #64562 fires from metadata, not auto-inference). * Endpoint filter on binding failure: drop the inaccurate ValueTask<object?> claim (PR #64539 applies to any return type), and call out RouteHandlerOptions.ThrowOnBadRequest = false so the filter observes the 400 in Development mode. Filed dotnet/aspnetcore#66541 for a Virtualize prepend edge case (scroll-anchor regression when `_itemsBefore == 0`); release-notes claim left as-is — the bug only affects the case where the user has not yet scrolled the rendered window past index 0. Circuit-pause and `mcpserver` template remain documented; both PRs were merged late in the cycle and are expected to land in a Preview 4 servicing build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* HTTP QUERY (#65714) is OpenAPI-only; reword and rename heading. * Virtualize: clarify #65951 covers height-changes-above-viewport (no API change). Add separate section for #66521's new AnchorMode parameter, including ItemComparer guidance for reference-type items. * Add a Runtime-async section for #66449 (backport of #66200). Removes the pre-filtering note that excluded it. Feedback from BrennanConroy and ilonatommy on #10389. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Missed in initial pass: dotnet/aspnetcore#65885 fixes the Blazor Web Worker template failing in published WASM apps because workers don't inherit the page's import map. Belongs alongside the existing WebWorker template entries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Drop backport PR # (use original #66200 only) * Add a call to action for developers to test their apps and report regressions caused by runtime-async enablement. Feedback from BrennanConroy on #10389. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…eal CircuitHandler pattern Verified against 11.0.0-preview.4.26230.115: there is no public registry of active circuits. The supported discovery path is CircuitHandler.OnConnectionUpAsync. Updated the example to track circuits in a CircuitHandler and drain them via the captured references. Also clarify return-value semantics and that onPauseRequested is a JS-side option on Blazor.start(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Documents how to opt in to the new Blazor Gateway (PR dotnet/aspnetcore#65982) in a standalone Blazor WebAssembly app: swapping the DevServer reference for Microsoft.AspNetCore.Components.Gateway, configuring YARP proxying to backend APIs, and exposing a runtime config endpoint to the client. Links to the GatewayDemo sample in danroth27/AspNetCore11Samples for an end-to-end setup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sample was restructured to live in BlazorWasmFeatures/ alongside sibling BackendApi/ and Gateway/ projects (replacing the GatewayDemo/ subtree). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Microsoft.AspNetCore.Components.Gateway package isn't being produced on the build feeds (the Web SDK defaults IsPackable to false, silently no-op'ing Pack). A fix is up at dotnet/aspnetcore#66579 but won't make Preview 4, so remove the section and TOC entry; we'll bring it back when the package ships. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Update: pulling the Blazor Gateway section back out of the Preview 4 release notes for now. The package isn't being produced on the build feeds — root cause turned out to be that |
|
|
||
| Apps that use OpenTelemetry or hot reload aren't affected — the feature switches default on in those configurations. | ||
|
|
||
| ## Runtime-async enabled for shared framework libraries |
There was a problem hiding this comment.
cc @agocke in case you want to provide input on the messaging here.
- Remove duplicate 'Thank you @kilifu' line in HTTP QUERY section. - Add UseTlsClientHelloListener snippet to the TLS section. - Split 'OpenAPI and minimal API improvements' into two sections so the endpoint-filter bullet (not OpenAPI-related) stands on its own. - Remove the agent-generated 'Filtered features' HTML comment block. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
| ```csharp | ||
| var builder = WebApplication.CreateBuilder(args); | ||
|
|
||
| builder.WebHost.ConfigureKestrel(options => | ||
| { | ||
| options.ListenAnyIP(5001, listenOptions => | ||
| { | ||
| listenOptions.UseHttps(); | ||
| listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) => | ||
| { | ||
| // Inspect the ClientHello (SNI, ALPN, etc.) for diagnostics or routing. | ||
| }); | ||
| }); | ||
| }); | ||
| ``` |
There was a problem hiding this comment.
@BrennanConroy This is what copilot came up with for a snippet for UseTlsClientHelloListener. Does it look ok?
| options.ListenAnyIP(5001, listenOptions => | ||
| { | ||
| listenOptions.UseHttps(); | ||
| listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) => |
There was a problem hiding this comment.
This must be called before UseHttps()
| listenOptions.UseHttps(); | ||
| listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) => | ||
| { | ||
| // Inspect the ClientHello (SNI, ALPN, etc.) for diagnostics or routing. | ||
| }); | ||
| }); |
There was a problem hiding this comment.
| listenOptions.UseHttps(); | |
| listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) => | |
| { | |
| // Inspect the ClientHello (SNI, ALPN, etc.) for diagnostics or routing. | |
| }); | |
| }); | |
| // This must be called before UseHttps() | |
| listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) => | |
| { | |
| // Inspect the ClientHello (SNI, ALPN, etc.) for diagnostics or routing. | |
| }) | |
| listenOptions.UseHttps(); | |
| }); |
|
|
||
| ## Endpoint filters observe parameter-binding failures | ||
|
|
||
| When a minimal API endpoint has any filters or filter factories configured, the filter pipeline now runs even if parameter binding fails ([dotnet/aspnetcore #64539](https://github.com/dotnet/aspnetcore/pull/64539)). Filters can read `HttpContext.Response.StatusCode == 400` and substitute their own response body. Endpoints without filters continue to short-circuit with a 400 as before. In Development, set `RouteHandlerOptions.ThrowOnBadRequest = false` so the framework returns a 400 the filter can observe instead of throwing `BadHttpRequestException` to the developer exception page. |
There was a problem hiding this comment.
Should we call out this was backported to 10.0.8?
| When a minimal API endpoint has any filters or filter factories configured, the filter pipeline now runs even if parameter binding fails ([dotnet/aspnetcore #64539](https://github.com/dotnet/aspnetcore/pull/64539)). Filters can read `HttpContext.Response.StatusCode == 400` and substitute their own response body. Endpoints without filters continue to short-circuit with a 400 as before. In Development, set `RouteHandlerOptions.ThrowOnBadRequest = false` so the framework returns a 400 the filter can observe instead of throwing `BadHttpRequestException` to the developer exception page. | |
| When a minimal API endpoint has any filters or filter factories configured, the filter pipeline now runs even if parameter binding fails ([dotnet/aspnetcore #64539](https://github.com/dotnet/aspnetcore/pull/64539)). Filters can read `HttpContext.Response.StatusCode == 400` and substitute their own response body. | |
| In the `Development` environment, set `RouteHandlerOptions.ThrowOnBadRequest = false` so the framework returns a 400 the filter can observe instead of throwing `BadHttpRequestException` to the developer exception page. This is already the default in non-`Development` environments. | |
| This change was has also been backported to 10.0.8. |
I also don't think the short-circuit bit adds anything, because what's being short circuited? The non-existent filters? The endpoint gets skipped with or without filters.
|
|
||
| ## HTTP QUERY in generated OpenAPI documents | ||
|
|
||
| OpenAPI document generation now recognizes [HTTP QUERY](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/) as a first-class operation type ([dotnet/aspnetcore #65714](https://github.com/dotnet/aspnetcore/pull/65714)). QUERY is a proposed safe, idempotent method that lets clients send a request body when describing a search — useful when a query is too large or too structured to fit in a URL. Routing already accepted arbitrary verb strings via `MapMethods`; this change makes QUERY endpoints show up correctly in the generated OpenAPI document so client generators and API explorers can consume them. |
There was a problem hiding this comment.
| OpenAPI document generation now recognizes [HTTP QUERY](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/) as a first-class operation type ([dotnet/aspnetcore #65714](https://github.com/dotnet/aspnetcore/pull/65714)). QUERY is a proposed safe, idempotent method that lets clients send a request body when describing a search — useful when a query is too large or too structured to fit in a URL. Routing already accepted arbitrary verb strings via `MapMethods`; this change makes QUERY endpoints show up correctly in the generated OpenAPI document so client generators and API explorers can consume them. | |
| OpenAPI document generation now recognizes [HTTP QUERY](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/) as a known operation type ([dotnet/aspnetcore #65714](https://github.com/dotnet/aspnetcore/pull/65714)). QUERY is a proposed safe, idempotent method that lets clients send a request body when describing a search — useful when a query is too large or too structured to fit in a URL. Routing already accepted arbitrary verb strings via `MapMethods`; this change makes QUERY endpoints show up correctly in the generated OpenAPI document so client generators and API explorers can consume them. |
Because you know someone is going to call us out for calling it "first-class" and not adding MapQuery() or [HttpQuery].
ASP.NET Core release notes for .NET 11 Preview 4.
Targets the milestone base branch #10388. Merging this PR
into
release-notes/11.0-preview4addsaspnetcore.mdto the milestone.Generated end-to-end by the
release-notesskill. AI-authored content;please review for accuracy, resolve any inline
<!-- TODO -->placeholders,and then mark this PR ready for review.
cc @danroth27