Skip to content

[release-notes] ASP.NET Core in .NET 11 Preview 4#10389

Open
danroth27 wants to merge 12 commits intorelease-notes/11.0-preview4from
release-notes/11.0-preview4-aspnetcore
Open

[release-notes] ASP.NET Core in .NET 11 Preview 4#10389
danroth27 wants to merge 12 commits intorelease-notes/11.0-preview4from
release-notes/11.0-preview4-aspnetcore

Conversation

@danroth27
Copy link
Copy Markdown
Member

ASP.NET Core release notes for .NET 11 Preview 4.

Targets the milestone base branch #10388. Merging this PR
into release-notes/11.0-preview4 adds aspnetcore.md to the milestone.

Generated end-to-end by the release-notes skill. AI-authored content;
please review for accuracy, resolve any inline <!-- TODO --> placeholders,
and then mark this PR ready for review.

cc @danroth27

Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
danroth27 and others added 3 commits April 30, 2026 07:00
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>
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
danroth27 and others added 5 commits May 1, 2026 15:58
* 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>
@danroth27
Copy link
Copy Markdown
Member Author

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 Microsoft.NET.Sdk.Web defaults IsPackable to false, so the Gateway project's Pack target silently no-ops despite IsShippingPackage=true and a custom NuspecFile. One-line fix is up at dotnet/aspnetcore#66579, but it won't make Preview 4. We'll bring the content back once the package actually ships.

Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated

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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @agocke in case you want to provide input on the messaging here.

Comment thread release-notes/11.0/preview/preview4/aspnetcore.md Outdated
- 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>
Comment on lines +164 to +178
```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.
});
});
});
```
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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) =>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +171 to +176
listenOptions.UseHttps();
listenOptions.UseTlsClientHelloListener((connection, clientHelloBytes) =>
{
// Inspect the ClientHello (SNI, ALPN, etc.) for diagnostics or routing.
});
});
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we call out this was backported to 10.0.8?

Suggested change
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.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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].

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants