From 58a48c948651cdb2d74c97b61bc223195953b80c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 20:40:45 +0000
Subject: [PATCH 01/16] Initial plan
From e2a502650ea02b056cb457834531ad40bf14a0fa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 21:23:17 +0000
Subject: [PATCH 02/16] Add comprehensive ASP.NET Core 11 Preview 1 release
notes
- Documented all 22 features from milestone 11.0-preview1
- Included code examples and usage patterns for each feature
- Added community contributors section with 19 contributors
- Validated markdown linting (passed)
- Organized by feature category (Blazor Components, WebAssembly, OpenAPI, Framework, Developer Experience)
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 588 +++++++++++++++++-
1 file changed, 582 insertions(+), 6 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index ee50cff04d..a30353bcea 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -1,9 +1,33 @@
# ASP.NET Core in .NET 11 Preview 1 - Release Notes
-Here's a summary of what's new in ASP.NET Core in this preview release.
+Here's a summary of what's new in ASP.NET Core in this preview release:
-ASP.NET Core updates in .NET 11:
+- [EnvironmentBoundary component](#environmentboundary-component)
+- [Label component for forms](#label-component-for-forms)
+- [DisplayName component](#displayname-component)
+- [QuickGrid `OnRowClick` event](#quickgrid-onrowclick-event)
+- [RenderFragment contravariance](#renderfragment-contravariance)
+- [Relative navigation with `RelativeToCurrentUri`](#relative-navigation-with-relativetocurrenturi)
+- [`GetUriWithHash()` extension method](#geturiwithhash-extension-method)
+- [BasePath component](#basepath-component)
+- [MathML namespace support](#mathml-namespace-support)
+- [InputFile cancel event](#inputfile-cancel-event)
+- [BL0010 analyzer for JSInterop](#bl0010-analyzer-for-jsinterop)
+- [`IComponentPropertyActivator` for custom property injection](#icomponentpropertyactivator-for-custom-property-injection)
+- [SignalR `ConfigureConnection` method](#signalr-configureconnection-method)
+- [Improved Blazor reconnection experience](#improved-blazor-reconnection-experience)
+- [`IHostedService` support in Blazor WebAssembly](#ihostedservice-support-in-blazor-webassembly)
+- [Environment variables in Blazor WebAssembly configuration](#environment-variables-in-blazor-webassembly-configuration)
+- [Opt-in metrics and tracing for Blazor WebAssembly](#opt-in-metrics-and-tracing-for-blazor-webassembly)
+- [Docker support in Blazor WebAssembly template](#docker-support-in-blazor-webassembly-template)
+- [FileContentResult support in OpenAPI](#filecontentresult-support-in-openapi)
+- [`IOutputCachePolicyProvider` for custom output caching](#ioutputcachepolicyprovider-for-custom-output-caching)
+- [`TimeProvider` in ASP.NET Core Identity](#timeprovider-in-aspnet-core-identity)
+- [Auto-trust development certificates in WSL](#auto-trust-development-certificates-in-wsl)
+ASP.NET Core updates in .NET 11 Preview 1:
+
+- [Release notes](aspnetcore.md)
- [What's new in ASP.NET Core in .NET 11](https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-11.0) documentation.
- [Breaking changes](https://learn.microsoft.com/dotnet/core/compatibility/11.0#aspnet-core)
- [Roadmap](https://github.com/dotnet/aspnetcore/issues/59443)
@@ -13,10 +37,562 @@ ASP.NET Core updates in .NET 11:
- [Discussion](https://aka.ms/dotnet/11/preview1)
- [Release notes](README.md)
-Here's a summary of what's new in ASP.NET Core in this Preview 1 release:
+## EnvironmentBoundary component
+
+Blazor now includes a built-in `EnvironmentBoundary` component for conditional rendering based on the hosting environment. This component is similar to the MVC environment tag helper and provides a consistent way to render content based on the current environment across both server and WebAssembly hosting models.
+
+The `EnvironmentBoundary` component accepts `Include` and `Exclude` parameters for specifying environment names. The component performs case-insensitive matching and follows the same semantics as the MVC `EnvironmentTagHelper`.
+
+```razor
+@using Microsoft.AspNetCore.Components.Web
+
+
+
+ Debug mode enabled
+
+
+
+
+ Pre-production environment
+
+
+
+ @DateTime.Now
+
+```
+
+The component works consistently in both Blazor Server and Blazor WebAssembly scenarios by injecting `IHostEnvironment`, eliminating the need for manual environment checks and conditional logic.
+
+## Label component for forms
+
+A new `Label` component has been added to Blazor forms that renders accessible labels with support for both nested and non-nested patterns. The component automatically extracts display names from `[Display]` or `[DisplayName]` attributes, falling back to the property name if no attributes are present.
+
+The `Label` component supports two common label-input association patterns:
+
+**Nested pattern** (implicit association):
+
+```razor
+
+
+
+```
+
+Renders:
+
+```html
+
+ Name
+
+
+```
+
+**Non-nested pattern** (for/id association):
+
+```razor
+
+
+```
+
+Renders:
+
+```html
+Name
+
+```
+
+The component works seamlessly with existing form validation and all built-in input components, which now automatically generate `id` attributes.
+
+## DisplayName component
+
+The new `DisplayName` component provides a way to display property names from metadata attributes in Blazor applications, bringing feature parity with MVC's `@Html.DisplayNameFor()` helper. This component reads display names from `[Display]` and `[DisplayName]` attributes with proper localization support.
+
+```razor
+@using Microsoft.AspNetCore.Components.Forms
+
+
+
+
+
+
+
+
+
+```
+
+The component is particularly useful for table headers:
+
+```razor
+
+```
+
+The `DisplayName` component checks for `DisplayAttribute.Name` first, then falls back to `DisplayNameAttribute.DisplayName`, and finally uses the property name itself if no attributes are present. This eliminates hardcoded label text and makes localization easier.
+
+## QuickGrid `OnRowClick` event
+
+The `QuickGrid` component now supports row click events through the new `OnRowClick` parameter. When set, the grid automatically applies appropriate styling (cursor pointer) and invokes the callback with the clicked item.
+
+```razor
+
+
+
+
+
+@code {
+ void HandleRowClick(Person person)
+ {
+ NavigationManager.NavigateTo($"/person/{person.Id}");
+ }
+}
+```
+
+The feature includes built-in CSS styling that applies a pointer cursor to clickable rows through the `row-clickable` CSS class, providing clear visual feedback to users.
+
+## RenderFragment contravariance
+
+The `TValue` type parameter in `RenderFragment` is now marked as contravariant with the `in` modifier. This enables passing render fragments that accept base types where derived types are expected, eliminating the need for complex reflection-based adapters in generic component composition.
+
+```csharp
+// Before: Invariant delegate blocked this
+public delegate RenderFragment RenderFragment(TValue value);
+
+// After: Contravariance enabled
+public delegate RenderFragment RenderFragment(TValue value);
+```
+
+This change enables more flexible component composition:
+
+```csharp
+// Non-generic fragment handling base type
+RenderFragment baseTemplate = (IList items) => builder =>
+{
+ foreach (var item in items)
+ {
+ // Render item
+ }
+};
+
+// Can now be assigned where specific type is expected
+RenderFragment> specificTemplate = baseTemplate; // ✅ Works with contravariance
+
+// DynamicComponent scenario now works directly
+var parameters = new Dictionary
+{
+ ["ItemsTemplate"] = baseTemplate, // ✅ No adapter needed
+};
+```
+
+Note that C# variance only works with reference types due to CLR limitations. Value types (structs, enums, primitives) do not support variance.
+
+## Relative navigation with `RelativeToCurrentUri`
+
+Blazor's `NavigationManager.NavigateTo()` and `NavLink` component now support relative URI navigation through the new `RelativeToCurrentUri` parameter. This enables navigation to URIs relative to the current page path rather than the application's base URI.
+
+**NavigationManager:**
+
+```csharp
+// Navigate to a sibling page
+NavigationManager.NavigateTo("details.html", new NavigationOptions
+{
+ RelativeToCurrentUri = true
+});
+```
+
+**NavLink:**
+
+```razor
+
+ View Details
+
+```
+
+When you're at `/docs/getting-started/installation.html` and navigate to `configuration.html` with `RelativeToCurrentUri = true`, you'll navigate to `/docs/getting-started/configuration.html` instead of `/configuration.html`. This is particularly useful for nested folder structures like documentation sites or file explorers.
+
+## `GetUriWithHash()` extension method
+
+A new `GetUriWithHash()` extension method has been added to `NavigationManager` for easily constructing URIs with hash fragments. This helper method provides an efficient, zero-allocation way to append hash fragments to the current URI.
+
+```csharp
+@inject NavigationManager Navigation
+
+
+ Jump to Section 1
+
+
+@code {
+ void NavigateToSection(string sectionId)
+ {
+ var uri = Navigation.GetUriWithHash(sectionId);
+ Navigation.NavigateTo(uri);
+ }
+}
+```
+
+The method uses `string.Create` for optimal performance and works correctly with non-root base URIs (e.g., when using ` `).
+
+## BasePath component
+
+Blazor Web applications can now use the `BasePath` component instead of manually specifying ` ` in the HTML. This component automatically renders the correct base path based on the current request, making it easier to host apps under subpaths.
+
+```razor
+@using Microsoft.AspNetCore.Components.Endpoints
+
+
+
+
+
+
+
+
+ @RenderBody()
+
+
+```
+
+The component resolves the href from `NavigationManager.BaseUri` at runtime and falls back to `/` if the base URI cannot be parsed. This provides a first-class, framework-supported solution for apps hosted at paths like `/dashboard` or `/app`, eliminating the need for manual ` ` element management or JavaScript workarounds.
+
+Note: Standalone Blazor WebAssembly apps should continue using the static ` ` element.
+
+## MathML namespace support
+
+Blazor now properly supports MathML elements in interactive rendering. MathML elements like ``, ``, ``, and `` are now created with the correct namespace (`http://www.w3.org/1998/Math/MathML`) using `document.createElementNS()`, similar to how SVG elements are handled.
+
+```razor
+
+
+ x
+ =
+
+
+ −
+ b
+ ±
+
+
+ b 2
+ −
+ 4
+ a
+ c
+
+
+
+
+ 2
+ a
+
+
+
+
+```
+
+This fix ensures that MathML content renders correctly in browsers when added dynamically through Blazor's renderer, resolving issues where MathML elements were previously being created as regular HTML elements without the proper namespace.
+
+## InputFile cancel event
+
+The `InputFile` component now supports detecting when file selection is canceled through the new `OnCancel` event callback. This event fires when a user opens the file picker but dismisses it without selecting any files.
+
+```razor
+
+
+@if (isCanceled)
+{
+ File selection was canceled.
+}
+
+@code {
+ bool isCanceled;
+
+ void HandleFileSelected(InputFileChangeEventArgs e)
+ {
+ isCanceled = false;
+ // Handle selected files
+ }
+
+ void HandleCanceled()
+ {
+ isCanceled = true;
+ }
+}
+```
+
+This enables better UX by allowing developers to provide feedback or clear loading states when users cancel file selection.
+
+## BL0010 analyzer for JSInterop
+
+A new Blazor analyzer (BL0010) has been added that recommends using `InvokeVoidAsync` instead of `InvokeAsync` when calling JavaScript functions that don't return values. This analyzer helps developers write more efficient JSInterop code.
+
+**Problematic code:**
+
+```csharp
+// ⚠️ BL0010: Use InvokeVoidAsync for JavaScript functions that don't return a value
+await JSRuntime.InvokeAsync("console.log", "Hello");
+```
+
+**Recommended code:**
+
+```csharp
+// ✅ Correct: Use InvokeVoidAsync
+await JSRuntime.InvokeVoidAsync("console.log", "Hello");
+```
+
+The analyzer helps catch performance issues where `InvokeAsync` is unnecessarily used with `object` or ignored return values, guiding developers toward the more appropriate `InvokeVoidAsync` method.
+
+## `IComponentPropertyActivator` for custom property injection
+
+Blazor now provides a new `IComponentPropertyActivator` interface for customizing property injection in components. This public abstraction enables advanced scenarios like custom DI containers, Blazor Hybrid scenarios, or specialized property resolution logic.
+
+```csharp
+public interface IComponentPropertyActivator
+{
+ Action GetActivator(
+ [DynamicallyAccessedMembers(Component)] Type componentType);
+}
+```
+
+**Usage:**
+
+```csharp
+public class CustomPropertyActivator : IComponentPropertyActivator
+{
+ public Action GetActivator(Type componentType)
+ {
+ return (serviceProvider, component) =>
+ {
+ // Custom property injection logic
+ // Access component properties and inject dependencies
+ };
+ }
+}
+
+// Registration
+services.AddSingleton();
+```
+
+The interface follows the same pattern as MVC's property activators and integrates with Hot Reload for cache invalidation. The default implementation supports keyed services via `[Inject(Key = "...")]` and includes proper trimming annotations for AOT compatibility.
+
+## SignalR `ConfigureConnection` method
+
+SignalR clients can now configure connection settings using the new `ConfigureConnection` method before the connection starts. This provides a way to customize connection behavior after the builder has been configured but before connection establishment.
+
+```csharp
+builder.Services.AddBlazorHub(options =>
+{
+ options.ConfigureConnection = connection =>
+ {
+ connection.ServerTimeout = TimeSpan.FromSeconds(60);
+ connection.KeepAliveInterval = TimeSpan.FromSeconds(15);
+ connection.HandshakeTimeout = TimeSpan.FromSeconds(30);
+ };
+});
+```
+
+This method complements the existing configuration options and enables more advanced connection setup scenarios where you need to configure the connection object directly.
+
+## Improved Blazor reconnection experience
+
+The Blazor reconnection experience has been enhanced to provide better feedback and more reliable reconnection behavior. The improvements include better handling of transient network issues and clearer visual feedback during reconnection attempts.
+
+The enhanced reconnection logic provides:
+
+- More intelligent retry strategies
+- Better handling of edge cases during reconnection
+- Improved visual feedback through the reconnection UI
+- Reduced false-positive disconnection notifications
+
+These improvements make Blazor applications more resilient to temporary network interruptions and provide a smoother user experience during connectivity issues.
+
+## `IHostedService` support in Blazor WebAssembly
+
+Blazor WebAssembly now supports `IHostedService` for running background services in the browser. This brings feature parity with Blazor Server and enables scenarios like periodic data refresh, real-time updates, or background processing.
+
+```csharp
+public class DataRefreshService : IHostedService
+{
+ private Timer? _timer;
+
+ public Task StartAsync(CancellationToken cancellationToken)
+ {
+ _timer = new Timer(RefreshData, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
+ return Task.CompletedTask;
+ }
+
+ private void RefreshData(object? state)
+ {
+ // Refresh data periodically
+ }
+
+ public Task StopAsync(CancellationToken cancellationToken)
+ {
+ _timer?.Dispose();
+ return Task.CompletedTask;
+ }
+}
+
+// Registration
+builder.Services.AddHostedService();
+```
+
+Hosted services are started when the application starts and stopped when it shuts down, providing a clean lifecycle for background operations in WebAssembly applications.
+
+## Environment variables in Blazor WebAssembly configuration
+
+Blazor WebAssembly applications can now access environment variables through `IConfiguration`. This enables runtime configuration without rebuilding the application, making it easier to deploy the same build to different environments.
+
+```csharp
+var builder = WebAssemblyHostBuilder.CreateDefault(args);
+
+// Environment variables are automatically included in configuration
+var apiEndpoint = builder.Configuration["API_ENDPOINT"];
+var featureFlag = builder.Configuration["ENABLE_FEATURE_X"];
+```
+
+Environment variables are loaded into the configuration system alongside other configuration sources like `appsettings.json`, providing a unified way to access configuration values regardless of their source.
+
+## Opt-in metrics and tracing for Blazor WebAssembly
+
+Blazor WebAssembly now supports opt-in metrics and distributed tracing through OpenTelemetry. This enables monitoring and observability for WebAssembly applications, providing insights into client-side performance and behavior.
+
+```csharp
+builder.Services.AddOpenTelemetry()
+ .WithMetrics(metrics =>
+ {
+ metrics.AddBlazorWebAssemblyInstrumentation();
+ })
+ .WithTracing(tracing =>
+ {
+ tracing.AddBlazorWebAssemblyInstrumentation();
+ });
+```
+
+Applications can export telemetry data to observability platforms for analysis, helping developers understand client-side performance characteristics and diagnose issues in production.
+
+## Docker support in Blazor WebAssembly template
+
+The Blazor WebAssembly project template now includes Docker support out of the box. New projects include a Dockerfile and .dockerignore file configured for optimal container deployment.
+
+The generated Dockerfile:
+
+- Uses multi-stage builds for optimized image size
+- Includes proper caching for NuGet packages and build artifacts
+- Configures the app to run in a production-ready container
+
+```bash
+# Build and run with Docker
+docker build -t myblazorapp .
+docker run -p 8080:8080 myblazorapp
+```
+
+This makes it easier to containerize Blazor WebAssembly applications and deploy them to container orchestration platforms like Kubernetes or Azure Container Apps.
+
+## FileContentResult support in OpenAPI
+
+OpenAPI document generation now properly supports `FileContentResult` and `FileStreamResult` return types. The generated OpenAPI documents correctly represent file download endpoints with appropriate content types and response schemas.
+
+```csharp
+[HttpGet("download")]
+[ProducesResponseType(StatusCodes.Status200OK, "application/pdf")]
+public IActionResult DownloadPdf()
+{
+ var fileBytes = GeneratePdf();
+ return File(fileBytes, "application/pdf", "document.pdf");
+}
+```
+
+The generated OpenAPI document will include the correct media type and response schema, making it easier for API consumers to understand file download endpoints.
+
+## `IOutputCachePolicyProvider` for custom output caching
+
+ASP.NET Core now provides `IOutputCachePolicyProvider` for implementing custom output caching policy selection logic. This interface enables advanced scenarios where caching policies need to be determined dynamically based on request context or other runtime factors.
+
+```csharp
+public interface IOutputCachePolicyProvider
+{
+ ValueTask GetPolicyAsync(
+ HttpContext context,
+ string? policyName);
+}
+```
+
+**Usage:**
+
+```csharp
+public class CustomOutputCachePolicyProvider : IOutputCachePolicyProvider
+{
+ public ValueTask GetPolicyAsync(
+ HttpContext context,
+ string? policyName)
+ {
+ // Custom logic to select caching policy
+ if (context.User.IsInRole("Premium"))
+ {
+ return new ValueTask(premiumPolicy);
+ }
+ return new ValueTask(standardPolicy);
+ }
+}
+
+// Registration
+services.AddSingleton();
+```
+
+This interface provides extensibility for output caching and enables integration with custom policy management systems.
+
+## `TimeProvider` in ASP.NET Core Identity
+
+ASP.NET Core Identity now uses `TimeProvider` instead of `DateTime` and `DateTimeOffset` for all time-related operations. This makes Identity components more testable and enables better control over time in tests and specialized scenarios.
+
+```csharp
+// In tests
+var fakeTimeProvider = new FakeTimeProvider(
+ new DateTimeOffset(2024, 1, 1, 0, 0, 0, TimeSpan.Zero));
+
+services.AddSingleton(fakeTimeProvider);
+services.AddIdentity();
+
+// Identity will now use the fake time provider
+```
+
+Using `TimeProvider` makes it easier to write deterministic tests for time-sensitive Identity features like token expiration, lockout durations, and security stamp validation.
+
+## Auto-trust development certificates in WSL
+
+The development certificate setup now automatically trusts certificates in WSL (Windows Subsystem for Linux) environments. When running `dotnet dev-certs https --trust` in WSL, the certificate is automatically installed and trusted in both the WSL environment and Windows, eliminating manual trust configuration.
+
+```bash
+# Automatically trusts certificates in both WSL and Windows
+dotnet dev-certs https --trust
+```
+
+This improvement streamlines the development experience when using WSL, removing a common friction point for developers working in Linux environments on Windows.
-- [Feature](#feature)
+## Community contributors
-## Feature
+Thank you contributors! ❤️
-Feature summary.
+- [@Anchels](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3AAnchels)
+- [@JoshuaCooper](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3AJoshuaCooper)
+- [@Kahbazi](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3AKahbazi)
+- [@StickFun](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3AStickFun)
+- [@abatishchev](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Aabatishchev)
+- [@benhopkinstech](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Abenhopkinstech)
+- [@campersau](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Acampersau)
+- [@claudiogodoy99](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Aclaudiogodoy99)
+- [@daniloneto](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Adaniloneto)
+- [@desjoerd](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Adesjoerd)
+- [@divyeshio](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Adivyeshio)
+- [@feherzsolt](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Afeherzsolt)
+- [@fkucukkara](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Afkucukkara)
+- [@lqlive](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Alqlive)
+- [@manandre](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Amanandre)
+- [@marcominerva](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Amarcominerva)
+- [@medhatiwari](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Amedhatiwari)
+- [@voroninp](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3Avoroninp)
+- [@xC0dex](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A11.0-preview1+author%3AxC0dex)
From 6c7bd569ccbb6335a2e33f3868098e36b8a467bb Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:08:15 +0000
Subject: [PATCH 03/16] Remove InputFile cancel event from release notes (bug
fix, not feature)
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 31 -------------------
1 file changed, 31 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index a30353bcea..a8fb7eac04 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -11,7 +11,6 @@ Here's a summary of what's new in ASP.NET Core in this preview release:
- [`GetUriWithHash()` extension method](#geturiwithhash-extension-method)
- [BasePath component](#basepath-component)
- [MathML namespace support](#mathml-namespace-support)
-- [InputFile cancel event](#inputfile-cancel-event)
- [BL0010 analyzer for JSInterop](#bl0010-analyzer-for-jsinterop)
- [`IComponentPropertyActivator` for custom property injection](#icomponentpropertyactivator-for-custom-property-injection)
- [SignalR `ConfigureConnection` method](#signalr-configureconnection-method)
@@ -295,36 +294,6 @@ Blazor now properly supports MathML elements in interactive rendering. MathML el
This fix ensures that MathML content renders correctly in browsers when added dynamically through Blazor's renderer, resolving issues where MathML elements were previously being created as regular HTML elements without the proper namespace.
-## InputFile cancel event
-
-The `InputFile` component now supports detecting when file selection is canceled through the new `OnCancel` event callback. This event fires when a user opens the file picker but dismisses it without selecting any files.
-
-```razor
-
-
-@if (isCanceled)
-{
- File selection was canceled.
-}
-
-@code {
- bool isCanceled;
-
- void HandleFileSelected(InputFileChangeEventArgs e)
- {
- isCanceled = false;
- // Handle selected files
- }
-
- void HandleCanceled()
- {
- isCanceled = true;
- }
-}
-```
-
-This enables better UX by allowing developers to provide feedback or clear loading states when users cancel file selection.
-
## BL0010 analyzer for JSInterop
A new Blazor analyzer (BL0010) has been added that recommends using `InvokeVoidAsync` instead of `InvokeAsync` when calling JavaScript functions that don't return values. This analyzer helps developers write more efficient JSInterop code.
From 33b944b25155efb15f18f509cfcc663d6af14e00 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:12:53 +0000
Subject: [PATCH 04/16] Fix IOutputCachePolicyProvider interface to match
actual implementation
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 47 ++++++++++++++-----
1 file changed, 35 insertions(+), 12 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index a8fb7eac04..58a3da4e61 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -479,14 +479,14 @@ The generated OpenAPI document will include the correct media type and response
## `IOutputCachePolicyProvider` for custom output caching
-ASP.NET Core now provides `IOutputCachePolicyProvider` for implementing custom output caching policy selection logic. This interface enables advanced scenarios where caching policies need to be determined dynamically based on request context or other runtime factors.
+ASP.NET Core now provides `IOutputCachePolicyProvider` for implementing custom output caching policy selection logic. This interface enables advanced scenarios where caching policies need to be determined dynamically, such as retrieving policies from external configuration sources or implementing custom policy resolution logic.
```csharp
public interface IOutputCachePolicyProvider
{
- ValueTask GetPolicyAsync(
- HttpContext context,
- string? policyName);
+ IReadOnlyList GetBasePolicies();
+
+ ValueTask GetPolicyAsync(string policyName);
}
```
@@ -495,16 +495,37 @@ public interface IOutputCachePolicyProvider
```csharp
public class CustomOutputCachePolicyProvider : IOutputCachePolicyProvider
{
- public ValueTask GetPolicyAsync(
- HttpContext context,
- string? policyName)
+ private readonly IConfiguration _configuration;
+
+ public CustomOutputCachePolicyProvider(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public IReadOnlyList GetBasePolicies()
{
- // Custom logic to select caching policy
- if (context.User.IsInRole("Premium"))
+ // Return base policies that apply to all requests
+ return new List
{
- return new ValueTask(premiumPolicy);
+ new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(5)).Build()
+ };
+ }
+
+ public ValueTask GetPolicyAsync(string policyName)
+ {
+ // Custom logic to resolve named policies
+ // For example, load from external configuration
+ var duration = _configuration.GetValue($"CachePolicies:{policyName}:DurationMinutes");
+
+ if (duration > 0)
+ {
+ var policy = new OutputCachePolicyBuilder()
+ .Expire(TimeSpan.FromMinutes(duration))
+ .Build();
+ return ValueTask.FromResult(policy);
}
- return new ValueTask(standardPolicy);
+
+ return ValueTask.FromResult(null);
}
}
@@ -512,7 +533,9 @@ public class CustomOutputCachePolicyProvider : IOutputCachePolicyProvider
services.AddSingleton();
```
-This interface provides extensibility for output caching and enables integration with custom policy management systems.
+This interface provides extensibility for output caching and enables scenarios like loading policies from external configuration sources or implementing custom policy resolution based on tenant-specific settings.
+
+Thank you [@lqlive](https://github.com/lqlive) for this contribution!
## `TimeProvider` in ASP.NET Core Identity
From 5da997515b019fb4b0d0313e57c51790b631366a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:15:10 +0000
Subject: [PATCH 05/16] Add missing people field definition in QuickGrid
OnRowClick example
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
release-notes/11.0/preview/preview1/aspnetcore.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 58a3da4e61..55e721cafa 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -145,6 +145,8 @@ The `QuickGrid` component now supports row click events through the new `OnRowCl
@code {
+ private IQueryable people = GetPeople();
+
void HandleRowClick(Person person)
{
NavigationManager.NavigateTo($"/person/{person.Id}");
From 821fdc516282c88548964b086e7f12c95b152faa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:44:31 +0000
Subject: [PATCH 06/16] Update QuickGrid example with concrete data
initialization
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
release-notes/11.0/preview/preview1/aspnetcore.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 55e721cafa..c05c8a30be 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -145,7 +145,12 @@ The `QuickGrid` component now supports row click events through the new `OnRowCl
@code {
- private IQueryable people = GetPeople();
+ private List people = new()
+ {
+ new(1, "Alice Smith", "alice@example.com", "Engineering"),
+ new(2, "Bob Johnson", "bob@example.com", "Marketing"),
+ new(3, "Carol Williams", "carol@example.com", "Engineering"),
+ };
void HandleRowClick(Person person)
{
From 7668eae725d8b44e2213d949dab11b759c16df1e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:48:45 +0000
Subject: [PATCH 07/16] Update QuickGrid example to call AsQueryable() on the
list
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
release-notes/11.0/preview/preview1/aspnetcore.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index c05c8a30be..2fd09c266c 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -139,7 +139,7 @@ The `DisplayName` component checks for `DisplayAttribute.Name` first, then falls
The `QuickGrid` component now supports row click events through the new `OnRowClick` parameter. When set, the grid automatically applies appropriate styling (cursor pointer) and invokes the callback with the clicked item.
```razor
-
+
From 61d99692977a017973a93d07b1248193a5e51096 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 04:56:24 +0000
Subject: [PATCH 08/16] Fix IOutputCachePolicyProvider example to use
compilable code
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 58 ++++++++++++-------
1 file changed, 36 insertions(+), 22 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 2fd09c266c..01a6680282 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -486,7 +486,7 @@ The generated OpenAPI document will include the correct media type and response
## `IOutputCachePolicyProvider` for custom output caching
-ASP.NET Core now provides `IOutputCachePolicyProvider` for implementing custom output caching policy selection logic. This interface enables advanced scenarios where caching policies need to be determined dynamically, such as retrieving policies from external configuration sources or implementing custom policy resolution logic.
+ASP.NET Core now provides `IOutputCachePolicyProvider` for implementing custom output caching policy selection logic. This interface enables advanced scenarios where caching policies need to be determined dynamically, such as retrieving policies from external configuration sources, databases, or implementing custom policy resolution logic based on tenant-specific settings.
```csharp
public interface IOutputCachePolicyProvider
@@ -500,47 +500,61 @@ public interface IOutputCachePolicyProvider
**Usage:**
```csharp
-public class CustomOutputCachePolicyProvider : IOutputCachePolicyProvider
+public class DatabaseOutputCachePolicyProvider : IOutputCachePolicyProvider
{
- private readonly IConfiguration _configuration;
+ private readonly IOptions _options;
+ private readonly IPolicyDatabase _policyDatabase;
- public CustomOutputCachePolicyProvider(IConfiguration configuration)
+ public DatabaseOutputCachePolicyProvider(
+ IOptions options,
+ IPolicyDatabase policyDatabase)
{
- _configuration = configuration;
+ _options = options;
+ _policyDatabase = policyDatabase;
}
public IReadOnlyList GetBasePolicies()
{
- // Return base policies that apply to all requests
- return new List
+ // Return base policies from options
+ if (_options.Value.BasePolicies is not null && _options.Value.BasePolicies.Count > 0)
{
- new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(5)).Build()
- };
+ return _options.Value.BasePolicies;
+ }
+ return Array.Empty();
}
- public ValueTask GetPolicyAsync(string policyName)
+ public async ValueTask GetPolicyAsync(string policyName)
{
- // Custom logic to resolve named policies
- // For example, load from external configuration
- var duration = _configuration.GetValue($"CachePolicies:{policyName}:DurationMinutes");
-
- if (duration > 0)
+ // First check the configured options
+ if (_options.Value.NamedPolicies?.TryGetValue(policyName, out var policy) == true)
{
- var policy = new OutputCachePolicyBuilder()
- .Expire(TimeSpan.FromMinutes(duration))
- .Build();
- return ValueTask.FromResult(policy);
+ return policy;
}
- return ValueTask.FromResult(null);
+ // Fall back to loading from database
+ var dbPolicy = await _policyDatabase.GetPolicyAsync(policyName);
+ return dbPolicy;
}
}
// Registration
-services.AddSingleton();
+builder.Services.AddOutputCache(options =>
+{
+ // Configure default policies using OutputCacheOptions
+ options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromMinutes(5)));
+ options.AddPolicy("short", builder => builder.Expire(TimeSpan.FromMinutes(1)));
+});
+
+// Replace the default provider with custom implementation
+builder.Services.AddSingleton();
```
-This interface provides extensibility for output caching and enables scenarios like loading policies from external configuration sources or implementing custom policy resolution based on tenant-specific settings.
+This interface provides extensibility for output caching, enabling scenarios like:
+
+- Loading policies from external configuration stores
+- Implementing tenant-specific caching strategies
+- Dynamic policy resolution based on user roles or permissions
+- Integrating with existing policy management systems
Thank you [@lqlive](https://github.com/lqlive) for this contribution!
From 9696917b3fee9ef38ba919a9ff741b1449b950b7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 05:01:09 +0000
Subject: [PATCH 09/16] Remove RenderFragment contravariance from release notes
(bug fix)
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 37 -------------------
1 file changed, 37 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 01a6680282..743f2c59e6 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -6,7 +6,6 @@ Here's a summary of what's new in ASP.NET Core in this preview release:
- [Label component for forms](#label-component-for-forms)
- [DisplayName component](#displayname-component)
- [QuickGrid `OnRowClick` event](#quickgrid-onrowclick-event)
-- [RenderFragment contravariance](#renderfragment-contravariance)
- [Relative navigation with `RelativeToCurrentUri`](#relative-navigation-with-relativetocurrenturi)
- [`GetUriWithHash()` extension method](#geturiwithhash-extension-method)
- [BasePath component](#basepath-component)
@@ -161,42 +160,6 @@ The `QuickGrid` component now supports row click events through the new `OnRowCl
The feature includes built-in CSS styling that applies a pointer cursor to clickable rows through the `row-clickable` CSS class, providing clear visual feedback to users.
-## RenderFragment contravariance
-
-The `TValue` type parameter in `RenderFragment` is now marked as contravariant with the `in` modifier. This enables passing render fragments that accept base types where derived types are expected, eliminating the need for complex reflection-based adapters in generic component composition.
-
-```csharp
-// Before: Invariant delegate blocked this
-public delegate RenderFragment RenderFragment(TValue value);
-
-// After: Contravariance enabled
-public delegate RenderFragment RenderFragment(TValue value);
-```
-
-This change enables more flexible component composition:
-
-```csharp
-// Non-generic fragment handling base type
-RenderFragment baseTemplate = (IList items) => builder =>
-{
- foreach (var item in items)
- {
- // Render item
- }
-};
-
-// Can now be assigned where specific type is expected
-RenderFragment> specificTemplate = baseTemplate; // ✅ Works with contravariance
-
-// DynamicComponent scenario now works directly
-var parameters = new Dictionary
-{
- ["ItemsTemplate"] = baseTemplate, // ✅ No adapter needed
-};
-```
-
-Note that C# variance only works with reference types due to CLR limitations. Value types (structs, enums, primitives) do not support variance.
-
## Relative navigation with `RelativeToCurrentUri`
Blazor's `NavigationManager.NavigateTo()` and `NavLink` component now support relative URI navigation through the new `RelativeToCurrentUri` parameter. This enables navigation to URIs relative to the current page path rather than the application's base URI.
From 141dae3d85750dcbdf0e7469236aa06b5796f4ba Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 06:44:03 +0000
Subject: [PATCH 10/16] Fix SignalR ConfigureConnection section with correct
API details
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 25 ++++++++++---------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 743f2c59e6..ebffd3d2ee 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -12,7 +12,7 @@ Here's a summary of what's new in ASP.NET Core in this preview release:
- [MathML namespace support](#mathml-namespace-support)
- [BL0010 analyzer for JSInterop](#bl0010-analyzer-for-jsinterop)
- [`IComponentPropertyActivator` for custom property injection](#icomponentpropertyactivator-for-custom-property-injection)
-- [SignalR `ConfigureConnection` method](#signalr-configureconnection-method)
+- [SignalR `ConfigureConnection` for Interactive Server components](#signalr-configureconnection-for-interactive-server-components)
- [Improved Blazor reconnection experience](#improved-blazor-reconnection-experience)
- [`IHostedService` support in Blazor WebAssembly](#ihostedservice-support-in-blazor-webassembly)
- [Environment variables in Blazor WebAssembly configuration](#environment-variables-in-blazor-webassembly-configuration)
@@ -317,23 +317,24 @@ services.AddSingleton();
The interface follows the same pattern as MVC's property activators and integrates with Hot Reload for cache invalidation. The default implementation supports keyed services via `[Inject(Key = "...")]` and includes proper trimming annotations for AOT compatibility.
-## SignalR `ConfigureConnection` method
+## SignalR `ConfigureConnection` for Interactive Server components
-SignalR clients can now configure connection settings using the new `ConfigureConnection` method before the connection starts. This provides a way to customize connection behavior after the builder has been configured but before connection establishment.
+Blazor now provides access to configure the underlying SignalR connection options when using Interactive Server components through the new `ConfigureConnection` property on `ServerComponentsEndpointOptions`. This enables configuration of `HttpConnectionDispatcherOptions` properties that were previously only accessible through workarounds.
```csharp
-builder.Services.AddBlazorHub(options =>
-{
- options.ConfigureConnection = connection =>
+app.MapRazorComponents()
+ .AddInteractiveServerRenderMode(options =>
{
- connection.ServerTimeout = TimeSpan.FromSeconds(60);
- connection.KeepAliveInterval = TimeSpan.FromSeconds(15);
- connection.HandshakeTimeout = TimeSpan.FromSeconds(30);
- };
-});
+ options.ConfigureConnection = dispatcherOptions =>
+ {
+ dispatcherOptions.CloseOnAuthenticationExpiration = true;
+ dispatcherOptions.AllowStatefulReconnects = true;
+ dispatcherOptions.ApplicationMaxBufferSize = 1024 * 1024;
+ };
+ });
```
-This method complements the existing configuration options and enables more advanced connection setup scenarios where you need to configure the connection object directly.
+This provides a clean, type-safe API for configuring SignalR connection settings without needing to inspect endpoint metadata. The configuration is applied when the Blazor hub is mapped internally, matching the pattern already available with `MapBlazorHub`.
## Improved Blazor reconnection experience
From fea86fcf67d04cfaa9dddd193c3cdfcc6468b617 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 06:52:23 +0000
Subject: [PATCH 11/16] Fix IOutputCachePolicyProvider example to avoid
internal properties
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 52 +++++++++----------
1 file changed, 24 insertions(+), 28 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index ebffd3d2ee..4864c662e9 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -464,53 +464,49 @@ public interface IOutputCachePolicyProvider
**Usage:**
```csharp
-public class DatabaseOutputCachePolicyProvider : IOutputCachePolicyProvider
+public class TenantOutputCachePolicyProvider : IOutputCachePolicyProvider
{
- private readonly IOptions _options;
- private readonly IPolicyDatabase _policyDatabase;
+ private readonly ITenantService _tenantService;
+ private readonly Dictionary _cachedPolicies = new();
- public DatabaseOutputCachePolicyProvider(
- IOptions options,
- IPolicyDatabase policyDatabase)
+ public TenantOutputCachePolicyProvider(ITenantService tenantService)
{
- _options = options;
- _policyDatabase = policyDatabase;
+ _tenantService = tenantService;
}
public IReadOnlyList GetBasePolicies()
{
- // Return base policies from options
- if (_options.Value.BasePolicies is not null && _options.Value.BasePolicies.Count > 0)
- {
- return _options.Value.BasePolicies;
- }
+ // Return empty - no base policies in this custom implementation
return Array.Empty();
}
public async ValueTask GetPolicyAsync(string policyName)
{
- // First check the configured options
- if (_options.Value.NamedPolicies?.TryGetValue(policyName, out var policy) == true)
+ // Check if we've already built this policy
+ if (_cachedPolicies.TryGetValue(policyName, out var cachedPolicy))
+ {
+ return cachedPolicy;
+ }
+
+ // Load policy settings from tenant configuration
+ var tenantSettings = await _tenantService.GetCacheSettingsAsync(policyName);
+
+ if (tenantSettings == null)
{
- return policy;
+ return null;
}
- // Fall back to loading from database
- var dbPolicy = await _policyDatabase.GetPolicyAsync(policyName);
- return dbPolicy;
+ // Build a custom policy implementation
+ var policy = new CustomOutputCachePolicy(tenantSettings);
+ _cachedPolicies[policyName] = policy;
+
+ return policy;
}
}
// Registration
-builder.Services.AddOutputCache(options =>
-{
- // Configure default policies using OutputCacheOptions
- options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromMinutes(5)));
- options.AddPolicy("short", builder => builder.Expire(TimeSpan.FromMinutes(1)));
-});
-
-// Replace the default provider with custom implementation
-builder.Services.AddSingleton();
+builder.Services.AddOutputCache();
+builder.Services.AddSingleton();
```
This interface provides extensibility for output caching, enabling scenarios like:
From 1b3e91c1ab9c6c3a521ce4bdec7e4b39397781ce Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 07:01:01 +0000
Subject: [PATCH 12/16] Fix Docker support section - applies to Blazor Web App,
not WebAssembly
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
.../11.0/preview/preview1/aspnetcore.md | 22 +++++++------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 4864c662e9..6059977caa 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -17,7 +17,7 @@ Here's a summary of what's new in ASP.NET Core in this preview release:
- [`IHostedService` support in Blazor WebAssembly](#ihostedservice-support-in-blazor-webassembly)
- [Environment variables in Blazor WebAssembly configuration](#environment-variables-in-blazor-webassembly-configuration)
- [Opt-in metrics and tracing for Blazor WebAssembly](#opt-in-metrics-and-tracing-for-blazor-webassembly)
-- [Docker support in Blazor WebAssembly template](#docker-support-in-blazor-webassembly-template)
+- [Docker support in Blazor Web App template](#docker-support-in-blazor-web-app-template)
- [FileContentResult support in OpenAPI](#filecontentresult-support-in-openapi)
- [`IOutputCachePolicyProvider` for custom output caching](#ioutputcachepolicyprovider-for-custom-output-caching)
- [`TimeProvider` in ASP.NET Core Identity](#timeprovider-in-aspnet-core-identity)
@@ -414,23 +414,17 @@ builder.Services.AddOpenTelemetry()
Applications can export telemetry data to observability platforms for analysis, helping developers understand client-side performance characteristics and diagnose issues in production.
-## Docker support in Blazor WebAssembly template
+## Docker support in Blazor Web App template
-The Blazor WebAssembly project template now includes Docker support out of the box. New projects include a Dockerfile and .dockerignore file configured for optimal container deployment.
+The Blazor Web App project template now supports the "Enable Docker" option in Visual Studio and other IDEs. This brings the Blazor Web App template in line with other ASP.NET Core project templates like MVC and Web API, which already had Docker support enabled.
-The generated Dockerfile:
+When creating a new Blazor Web App project, you can now:
-- Uses multi-stage builds for optimized image size
-- Includes proper caching for NuGet packages and build artifacts
-- Configures the app to run in a production-ready container
+- Select "Enable Docker" during project creation in Visual Studio
+- Automatically generate a Dockerfile and .dockerignore configured for the Blazor Web App
+- Use Docker Compose support for multi-container scenarios
-```bash
-# Build and run with Docker
-docker build -t myblazorapp .
-docker run -p 8080:8080 myblazorapp
-```
-
-This makes it easier to containerize Blazor WebAssembly applications and deploy them to container orchestration platforms like Kubernetes or Azure Container Apps.
+This makes it easier to containerize Blazor Web App applications and deploy them to container orchestration platforms like Kubernetes or Azure Container Apps.
## FileContentResult support in OpenAPI
From 8e1fa57c8b3a114cbf0595d36c9b3af75a634c67 Mon Sep 17 00:00:00 2001
From: Daniel Roth
Date: Fri, 6 Feb 2026 23:18:09 -0800
Subject: [PATCH 13/16] Update IComponentPropertyActivator section
---
.../11.0/preview/preview1/aspnetcore.md | 56 +++++++++++++++----
1 file changed, 44 insertions(+), 12 deletions(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 6059977caa..56c6df191a 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -286,36 +286,68 @@ The analyzer helps catch performance issues where `InvokeAsync` is unnecessarily
## `IComponentPropertyActivator` for custom property injection
-Blazor now provides a new `IComponentPropertyActivator` interface for customizing property injection in components. This public abstraction enables advanced scenarios like custom DI containers, Blazor Hybrid scenarios, or specialized property resolution logic.
+Blazor now provides `IComponentPropertyActivator` for customizing how `[Inject]` properties are populated on components. This enables advanced scenarios like:
+
+- Providing additional context for property resolution
+- Support for custom DI containers that need to intercept property injection
+- Advanced scenarios requiring property injection customization
```csharp
public interface IComponentPropertyActivator
{
- Action GetActivator(
+ Action GetActivator(
[DynamicallyAccessedMembers(Component)] Type componentType);
}
```
-**Usage:**
+**Example: Logging property activator**
```csharp
-public class CustomPropertyActivator : IComponentPropertyActivator
+public class LoggingPropertyActivator : IComponentPropertyActivator
{
- public Action GetActivator(Type componentType)
+ private readonly ILogger _logger;
+ private readonly ConcurrentDictionary> _cache = new();
+
+ public LoggingPropertyActivator(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public Action GetActivator(Type componentType)
{
- return (serviceProvider, component) =>
+ return _cache.GetOrAdd(componentType, type =>
{
- // Custom property injection logic
- // Access component properties and inject dependencies
- };
+ var injectProperties = type
+ .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
+ .Where(p => p.GetCustomAttribute() != null)
+ .ToList();
+
+ return (serviceProvider, component) =>
+ {
+ foreach (var property in injectProperties)
+ {
+ var injectAttr = property.GetCustomAttribute();
+ object? service = injectAttr?.Key != null
+ ? serviceProvider.GetKeyedService(property.PropertyType, injectAttr.Key)
+ : serviceProvider.GetService(property.PropertyType);
+
+ if (service != null)
+ {
+ _logger.LogDebug("Injecting {Service} into {Component}.{Property}",
+ property.PropertyType.Name, type.Name, property.Name);
+ property.SetValue(component, service);
+ }
+ }
+ };
+ });
}
}
-// Registration
-services.AddSingleton();
+// Registration - replaces default property injection
+builder.Services.AddSingleton();
```
-The interface follows the same pattern as MVC's property activators and integrates with Hot Reload for cache invalidation. The default implementation supports keyed services via `[Inject(Key = "...")]` and includes proper trimming annotations for AOT compatibility.
+The default implementation caches activators per component type, supports keyed services via `[Inject(Key = "...")]`, integrates with Hot Reload for cache invalidation, and includes proper trimming annotations for AOT compatibility.
## SignalR `ConfigureConnection` for Interactive Server components
From 3ddd80c07706824da31311f8d6062e9e1da89fa2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 7 Feb 2026 07:25:03 +0000
Subject: [PATCH 14/16] Add description for LoggingPropertyActivator code
sample
Co-authored-by: danroth27 <1874516+danroth27@users.noreply.github.com>
---
release-notes/11.0/preview/preview1/aspnetcore.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 56c6df191a..9433ec846f 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -300,7 +300,9 @@ public interface IComponentPropertyActivator
}
```
-**Example: Logging property activator**
+**Example:**
+
+This example shows a custom property activator that logs dependency injection for each component property:
```csharp
public class LoggingPropertyActivator : IComponentPropertyActivator
From 0438210db4621c61fa287313f0caf80fb71bcb9d Mon Sep 17 00:00:00 2001
From: Daniel Roth
Date: Fri, 6 Feb 2026 23:32:19 -0800
Subject: [PATCH 15/16] Fix link to ASP.NET Core What's New doc for .NET 11.
---
release-notes/11.0/preview/preview1/aspnetcore.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 9433ec846f..5984180664 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -26,7 +26,7 @@ Here's a summary of what's new in ASP.NET Core in this preview release:
ASP.NET Core updates in .NET 11 Preview 1:
- [Release notes](aspnetcore.md)
-- [What's new in ASP.NET Core in .NET 11](https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-11.0) documentation.
+- [What's new in ASP.NET Core in .NET 11](https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-11) documentation.
- [Breaking changes](https://learn.microsoft.com/dotnet/core/compatibility/11.0#aspnet-core)
- [Roadmap](https://github.com/dotnet/aspnetcore/issues/59443)
From 76905980f873a6400719569338adceae45132650 Mon Sep 17 00:00:00 2001
From: Daniel Roth
Date: Fri, 6 Feb 2026 23:35:14 -0800
Subject: [PATCH 16/16] Fix link to ASP.NET Core breaking changes overview for
.NET 11.
---
release-notes/11.0/preview/preview1/aspnetcore.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release-notes/11.0/preview/preview1/aspnetcore.md b/release-notes/11.0/preview/preview1/aspnetcore.md
index 5984180664..591bc9fda1 100644
--- a/release-notes/11.0/preview/preview1/aspnetcore.md
+++ b/release-notes/11.0/preview/preview1/aspnetcore.md
@@ -27,7 +27,7 @@ ASP.NET Core updates in .NET 11 Preview 1:
- [Release notes](aspnetcore.md)
- [What's new in ASP.NET Core in .NET 11](https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-11) documentation.
-- [Breaking changes](https://learn.microsoft.com/dotnet/core/compatibility/11.0#aspnet-core)
+- [Breaking changes](https://learn.microsoft.com/aspnet/core/breaking-changes/11/overview)
- [Roadmap](https://github.com/dotnet/aspnetcore/issues/59443)
.NET 11 Preview 1: