From 1b772d3e1289fb5166a4f016d4db95bf0cafc705 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:07:30 +0000 Subject: [PATCH 1/4] Initial plan From e346dc0c7b6c5925c4ab55cdb1c5648dad604ef8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:10:53 +0000 Subject: [PATCH 2/4] Document AZURE_TOKEN_CREDENTIALS breaking change in Aspire 13.0 Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> --- .../cloud/azure/azure-app-service.mdx | 4 ++ .../cloud/azure/configure-container-apps.mdx | 4 ++ .../src/content/docs/whats-new/aspire-13.mdx | 56 +++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx index ea4ffad2..6ce3450d 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx @@ -102,6 +102,10 @@ The preceding code: During local development (when running with ), the project runs locally. When you publish your app, the project is deployed as an Azure App Service website within the provisioned environment. + + ## Customize the App Service website The `PublishAsAzureAppServiceWebsite` method accepts a callback that allows you to customize the Azure App Service website configuration using the [Azure.Provisioning](https://learn.microsoft.com/dotnet/api/azure.provisioning) APIs: diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx index fa6ceef8..72f0b546 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx @@ -30,6 +30,10 @@ By using the `Azure.Provisioning` APIs (explained in [Customize Azure resources] This article guides you through the process of tailoring ACA environments for your solutions. + + ## Add an ACA environment The `AzureContainerAppEnvironmentResource` type models an ACA environment resource. When you call the `AddAzureContainerAppEnvironment` method, it creates an instance of this type (wrapped in the `IResourceBuilder`). diff --git a/src/frontend/src/content/docs/whats-new/aspire-13.mdx b/src/frontend/src/content/docs/whats-new/aspire-13.mdx index 613b8960..70f4ebf0 100644 --- a/src/frontend/src/content/docs/whats-new/aspire-13.mdx +++ b/src/frontend/src/content/docs/whats-new/aspire-13.mdx @@ -1653,6 +1653,62 @@ var app = builder.AddNodeApp("frontend", "../frontend", "server.js") .WithRunScript("dev"); ``` +#### DefaultAzureCredential behavior in Azure deployments + +Aspire 13.0 changes the default behavior of `DefaultAzureCredential` when deploying to Azure Container Apps and Azure App Service to use only `ManagedIdentityCredential`. + +**What changed:** + +When you deploy to Azure Container Apps or Azure App Service, Aspire now automatically sets the `AZURE_TOKEN_CREDENTIALS` environment variable to `managedidentity`. This forces `DefaultAzureCredential` to behave deterministically by only using `ManagedIdentityCredential`, instead of attempting other credential types like `EnvironmentCredential` or `WorkloadIdentityCredential` first. + +**Why this change:** + +- **Deterministic behavior**: Ensures `DefaultAzureCredential` always uses `ManagedIdentityCredential` in production. +- **Optimized resilience**: Enables retry logic and disables probe requests for improved performance. +- **Best practices**: Aligns with [Azure SDK authentication best practices](https://learn.microsoft.com/dotnet/azure/sdk/authentication/best-practices?tabs=aspdotnet#use-deterministic-credentials-in-production-environments). + +**Previous behavior (9.x):** + +`DefaultAzureCredential` used the full chain of credential types, attempting `EnvironmentCredential` and `WorkloadIdentityCredential` before `ManagedIdentityCredential`. + +**New behavior (13.0):** + +`DefaultAzureCredential` only uses `ManagedIdentityCredential` when the `AZURE_TOKEN_CREDENTIALS` environment variable is set to `managedidentity`. + +**Affected APIs:** + +- `AddAzureContainerAppEnvironment` +- `AddAzureAppServiceEnvironment` + +**Migration:** + +If you were relying on `EnvironmentCredential` or `WorkloadIdentityCredential` in your application, choose one of the following options: + +1. **Use explicit credentials**: Don't use `DefaultAzureCredential` in your application. Instead, explicitly use the specific credential type you need (e.g., `EnvironmentCredential` or `WorkloadIdentityCredential`). + +2. **Remove the environment variable**: Implement a callback to remove the `AZURE_TOKEN_CREDENTIALS` environment variable from the deployment: + + ```csharp + // For Azure Container Apps + builder.AddProject("frontend") + .PublishAsAzureContainerApp((infra, app) => + { + var containerAppContainer = app.Template.Containers[0].Value!; + var azureTokenCredentialEnv = containerAppContainer.Env + .Single(v => v.Value!.Name.Value == "AZURE_TOKEN_CREDENTIALS"); + containerAppContainer.Env.Remove(azureTokenCredentialEnv); + }); + + // For Azure App Service + builder.AddProject("frontend") + .PublishAsAzureAppServiceWebsite((infra, website) => + { + var azureTokenCredentialSetting = website.AppSettings + .Single(v => v.Value!.Name.Value == "AZURE_TOKEN_CREDENTIALS"); + website.AppSettings.Remove(azureTokenCredentialSetting); + }); + ``` + ### Migration guide #### Migrating from publishing callbacks to pipeline steps From 3e8e146811f32d8a4ceb0ad3cf5f227d9014ffe4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:11:14 +0000 Subject: [PATCH 3/4] Fix prettier formatting in documentation files Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> --- .../cloud/azure/azure-app-service.mdx | 11 +- .../cloud/azure/configure-container-apps.mdx | 11 +- .../src/content/docs/whats-new/aspire-13.mdx | 164 ++++++++++++------ 3 files changed, 134 insertions(+), 52 deletions(-) diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx index 6ce3450d..a465ab9d 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service.mdx @@ -103,7 +103,16 @@ The preceding code: During local development (when running with ), the project runs locally. When you publish your app, the project is deployed as an Azure App Service website within the provisioned environment. ## Customize the App Service website diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx index 72f0b546..c4edb914 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx @@ -31,7 +31,16 @@ By using the `Azure.Provisioning` APIs (explained in [Customize Azure resources] This article guides you through the process of tailoring ACA environments for your solutions. ## Add an ACA environment diff --git a/src/frontend/src/content/docs/whats-new/aspire-13.mdx b/src/frontend/src/content/docs/whats-new/aspire-13.mdx index 70f4ebf0..44025722 100644 --- a/src/frontend/src/content/docs/whats-new/aspire-13.mdx +++ b/src/frontend/src/content/docs/whats-new/aspire-13.mdx @@ -49,47 +49,49 @@ If you have feedback, questions, or want to contribute to Aspire, collaborate wi ## 🆙 Upgrade to Aspire 13.0 The easiest way to upgrade to Aspire 13.0 is using the `aspire update` command: 1. Update the Aspire CLI to the latest version: - - - - + + + + 2. Update your Aspire project using the [`aspire update` command](/reference/cli/commands/aspire-update/): - ```bash title="Aspire CLI — Update all Aspire packages" - aspire update - ``` - - This command will: + ```bash title="Aspire CLI — Update all Aspire packages" + aspire update + ``` - - Update the `Aspire.AppHost.Sdk` version in your AppHost project. - - Update all Aspire NuGet packages to version 13.0. - - Handle dependency resolution automatically. - - Support both regular projects and Central Package Management (CPM). + This command will: + - Update the `Aspire.AppHost.Sdk` version in your AppHost project. + - Update all Aspire NuGet packages to version 13.0. + - Handle dependency resolution automatically. + - Support both regular projects and Central Package Management (CPM). 3. Update your Aspire templates: - ```bash - dotnet new install Aspire.ProjectTemplates - ``` + ```bash + dotnet new install Aspire.ProjectTemplates + ``` ## 🧩 AppHost template updates @@ -217,6 +219,7 @@ var api = builder.AddUvicornApp("api", "./api", "main:app") ``` The `AddUvicornApp` method automatically: + - Configures HTTP endpoints. - Sets up appropriate Uvicorn command-line arguments. - Supports hot-reload during development. @@ -248,6 +251,7 @@ builder.AddUvicornApp("api", "./api", "main:app") ``` When using `WithUv()`, Aspire: + - Automatically runs `uv sync` to install dependencies from `pyproject.toml`. - Creates isolated virtual environments per project. - Leverages uv's performance benefits (10-100x faster than pip). @@ -263,6 +267,7 @@ builder.AddUvicornApp("api", "./api", "main:app") ``` When using `WithPip()`, Aspire: + - Automatically installs dependencies from `requirements.txt` or `pyproject.toml` (pip supports both). - Detects virtual environments (`.venv`) by walking up parent directories. - Creates a virtual environment if one doesn't exist. @@ -312,6 +317,7 @@ builder.AddUvicornApp("api", "./api", "main:app") ``` The generated Dockerfile automatically adapts based on your package manager choice: + - **With uv**: Uses uv for fast dependency installation from `pyproject.toml`. - **With pip**: Uses pip to install dependencies from `requirements.txt`. @@ -340,6 +346,7 @@ aspire new aspire-py-starter ``` This template includes: + - **FastAPI backend**: Python ASGI application using Uvicorn. - **Vite + React frontend**: Modern JavaScript frontend with TypeScript. - **OpenTelemetry integration**: Distributed tracing, logs, and metrics. @@ -350,13 +357,13 @@ Build a full-stack polyglot app—Python back end + JavaScript front end—fast. The React front end communicates with the FastAPI back end via HTTP endpoints, demonstrating seamless integration between the two languages within a single Aspire application. The new template has a modern UX: -import pythonStarterDarkPng from "@assets/get-started/python-starter-dark.png"; -import pythonStarterLightPng from "@assets/get-started/python-starter-light.png"; +import pythonStarterDarkPng from '@assets/get-started/python-starter-dark.png'; +import pythonStarterLightPng from '@assets/get-started/python-starter-light.png'; ### JavaScript as a first-class citizen @@ -379,6 +386,7 @@ var admin = builder.AddJavaScriptApp("admin", "./admin") ``` By default, `AddJavaScriptApp`: + - Automatically detects npm from `package.json`. - Runs the "dev" script during local development. - Runs the "build" script when publishing to create production assets. @@ -435,8 +443,8 @@ Unlike the deprecated `AddNpmApp` API, `AddJavaScriptApp` does not support an `a ```csharp title="C# — Pass arguments using WithArgs" // Before (Aspire 9.x with AddNpmApp) -// builder.AddNpmApp("hasura-console", "../Web/ClientApp", -// scriptName: "hasura:console", +// builder.AddNpmApp("hasura-console", "../Web/ClientApp", +// scriptName: "hasura:console", // args: ["--no-browser"]) // After (Aspire 13.0 with AddJavaScriptApp) @@ -458,8 +466,8 @@ builder.AddJavaScriptApp("hasura-console", "../Web/ClientApp") ```csharp title="C# — Reference custom script" // Before (Aspire 9.x with AddNpmApp) -// builder.AddNpmApp("hasura-console", "../Web/ClientApp", -// scriptName: "hasura:console", +// builder.AddNpmApp("hasura-console", "../Web/ClientApp", +// scriptName: "hasura:console", // args: ["--no-browser"]) // After (Aspire 13.0 with AddJavaScriptApp) @@ -479,6 +487,7 @@ var frontend = builder.AddViteApp("frontend", "./frontend") ``` Vite applications get: + - Automatic port binding configuration. - Hot module replacement (HMR) support. - Optimized build scripts for production. @@ -493,6 +502,7 @@ var app = builder.AddJavaScriptApp("app", "./app"); ``` The generated Dockerfile: + - Detects Node.js version from `.nvmrc`, `.node-version`, `package.json`, or `.tool-versions`. - Uses multi-stage builds for smaller images. - Installs dependencies in a separate layer for better caching. @@ -511,6 +521,7 @@ var app = builder.AddNodeApp("frontend", "./frontend", "app.js") ``` Node.js applications get: + - Defaults to npm when `package.json` exists. - Allows for customizing package manager and build/run scripts. - Automatic Dockerfile generation with multi-stage builds for smaller images (defaults to `node:22-alpine` if no version is specified). @@ -568,6 +579,7 @@ var container = builder.AddContainer("service", "myimage"); ``` Aspire automatically: + - **Python**: Configures `SSL_CERT_FILE` and `REQUESTS_CA_BUNDLE` environment variables. - **Node.js**: Configures `NODE_EXTRA_CA_CERTS` environment variable. - **Containers**: Mounts certificate bundles and configures appropriate environment variables. @@ -607,7 +619,8 @@ This feature makes Aspire's service discovery mechanism accessible to any progra The new `aspire init` command provides a streamlined, interactive experience for initializing Aspire solutions with comprehensive project setup and configuration. -Find out more about the `aspire init` command in the [aspire init documentation](/reference/cli/commands/aspire-init/). + Find out more about the `aspire init` command in the [aspire init + documentation](/reference/cli/commands/aspire-init/). ```bash title="Bash — Initialize new Aspire solution" @@ -658,7 +671,8 @@ Select a template: The starter template collection is designed to be extensible and will grow over time to showcase different architectural patterns and technology combinations. This approach makes it easier to explore Aspire's capabilities and learn from working examples. -For command reference material, see the [aspire new documentation](/reference/cli/commands/aspire-new/). + For command reference material, see the [aspire new + documentation](/reference/cli/commands/aspire-new/). ### Aspire update improvements @@ -677,12 +691,14 @@ aspire update --project ./src/MyApp.AppHost ``` **New in Aspire 13.0:** + - **CLI self-update**: The `--self` flag allows you to update the Aspire CLI without reinstalling. - **Improved reliability**: Numerous bug fixes for edge cases in dependency resolution. - **Better error handling**: Clearer error messages when updates fail. - **Performance improvements**: Faster package detection and update operations. The `aspire update` command continues to support: + - Central package management (CPM) solutions. - Diamond dependency resolution. - Single-file app hosts. @@ -691,7 +707,8 @@ The `aspire update` command continues to support: - Channel awareness (stable, preview, staging). -For detailed command reference, see [aspire update](/reference/cli/commands/aspire-update/). + For detailed command reference, see [aspire + update](/reference/cli/commands/aspire-update/). ### Visual Studio Code extension @@ -757,6 +774,7 @@ The Aspire CLI includes a preview feature for automatically installing required > [!IMPORTANT] > This is a preview feature that is **not enabled by default**. To use automatic SDK installation, enable it with: +> > ```bash > aspire config set features.dotnetSdkInstallationEnabled true > ``` @@ -938,7 +956,7 @@ var builder = DistributedApplication.CreateBuilder(args); var api = builder.AddProject("api"); -// To easily reach your local API project from the +// To easily reach your local API project from the // emulator/Simulator/physical device, you can use the Dev Tunnels integration var publicDevTunnel = builder.AddDevTunnel("devtunnel-public") .WithAnonymousAccess() @@ -955,13 +973,13 @@ mauiapp.AddWindowsDevice() mauiapp.AddMacCatalystDevice() .WithReference(api); -// Add MAUI app for iOS running on the iOS Simulator (starts +// Add MAUI app for iOS running on the iOS Simulator (starts // a random one, or uses the currently started one) mauiapp.AddiOSSimulator() .WithOtlpDevTunnel() // Needed to get the OpenTelemetry data to "localhost" .WithReference(api, publicDevTunnel); // Needs a dev tunnel to reach "localhost" -// Add MAUI app for Android running on the emulator with +// Add MAUI app for Android running on the emulator with // default emulator (uses running or default emulator, needs to be started) mauiapp.AddAndroidEmulator() .WithOtlpDevTunnel() // Needed to get the OpenTelemetry data to "localhost" @@ -992,6 +1010,7 @@ This enables a complete mobile + cloud development experience where you can run 3. Follow the instructions to configure your AI assistant (Claude Code, GitHub Copilot CLI, Cursor, VS Code, etc.). The MCP server uses streamable HTTP with API key authentication for secure access. Configuration requires: + - `url`: The Aspire MCP endpoint address. - `type`: Set to "http" for the streamable-HTTP MCP server. - `x-mcp-api-key`: HTTP header for authentication. @@ -1018,13 +1037,21 @@ The interaction service just got a major upgrade: You can see an example of the new interaction service features in the dashboard with the Azure provisioning dialog. 🚀 -New interaction service feature in the Azure provisioning dialog +New interaction service feature in the Azure provisioning dialog ### Polyglot language icons Aspire is going polyglot with strong support for JavaScript ☕ and Python 🐍 apps. The dashboard features new programming language icons for app resources. This includes .NET projects (C#, F#, VB.NET) and JavaScript and Python apps. -Polyglot language icons +Polyglot language icons ### Improved accent colors @@ -1032,13 +1059,21 @@ Resources in the dashboard have accent colors, which is used to color their icon The dark blue accent color is no longer almost invisible on a dark background! -Accent color tweaks +Accent color tweaks ### Health checks last run time The dashboard makes it easy to see resource health statuses. New in Aspire 13, the last run time is now displayed next to each resource’s current state. This helps you tell whether an unhealthy resource is still being checked and progressing toward a healthy state. -Health checks last run time +Health checks last run time ## 🖥️ App model enhancements @@ -1177,6 +1212,7 @@ var api = builder.AddProject("api") ``` **Environment variables injected into `api`:** + ```bash # From primaryDb with "primary" name ConnectionStrings__primary=Host=postgres-primary;... @@ -1206,6 +1242,7 @@ var worker = builder.AddProject("worker") ``` **Environment variables injected into `worker`:** + ```bash DB_HOST=postgres DB_PORT=5432 @@ -1231,6 +1268,7 @@ var frontend = builder.AddJavaScriptApp("frontend", "./frontend") ``` **Environment variables injected into `frontend`:** + ```bash # Default behavior - uses the external endpoint URL API_URL=https://localhost:7123 @@ -1246,6 +1284,7 @@ var worker = builder.AddProject("worker") ``` **Environment variables injected into `worker`:** + ```bash # Container network context - uses internal container address API_URL=http://api:8080 @@ -1256,18 +1295,22 @@ This enables proper service-to-service communication whether the consumer is run ### Other app model improvements **Compute environment support (graduated from experimental)**: + - `WithComputeEnvironment` API is now stable (no longer marked as experimental) - Deploy resources to specific compute environments without experimental warnings **Resource exclusion from MCP**: + - `ExcludeFromMcp` extension to exclude specific resources from Model Context Protocol exposure - Control which resources are visible to AI assistants and MCP clients **Reference environment injection control**: + - `WithReferenceEnvironment` to control how environment variables are injected from references - `ReferenceEnvironmentInjectionFlags` for fine-grained control over environment variable behavior **Helper methods**: + - `TryCreateResourceBuilder` for safely attempting resource builder creation with failure handling - Returns false instead of throwing when resource builder creation fails @@ -1413,6 +1456,7 @@ builder.AddAzureAppServiceEnvironment("env") ``` When enabled, Aspire automatically: + - Creates a Log Analytics workspace. - Creates an Application Insights resource. - Configures all App Service Web Apps with the connection string. @@ -1462,6 +1506,7 @@ aspire add javaScript The following APIs have been removed in Aspire 13.0: **Publishing infrastructure** (replaced by `aspire do`): + - `PublishingContext` and `PublishingCallbackAnnotation` - `DeployingContext` and `DeployingCallbackAnnotation` - `WithPublishingCallback` extension method @@ -1473,14 +1518,17 @@ The following APIs have been removed in Aspire 13.0: - `CompletionState` enum **Debugging APIs** (replaced with new flexible API): + - Old `WithDebugSupport` overload with `debugAdapterId` and `requiredExtensionId` parameters - `SupportsDebuggingAnnotation` (replaced with new debug support annotation) **Diagnostic codes**: + - `ASPIRECOMPUTE001` diagnostics (removed - API graduated from experimental) - `ASPIREPUBLISHERS001` (renamed to `ASPIREPIPELINES001-003`) **CLI commands**: + - `--watch` flag removed from `aspire run` (replaced by `features.defaultWatchEnabled` feature flag) ### Obsolete APIs @@ -1488,19 +1536,23 @@ The following APIs have been removed in Aspire 13.0: The following APIs are marked as obsolete in Aspire 13.0 and will be removed in a future release: **Lifecycle hooks**: + - `IDistributedApplicationLifecycleHook` interface - Use `IDistributedApplicationEventingSubscriber` instead **Lifecycle hook extension methods** (use eventing subscriber extensions instead): + - `AddLifecycleHook()` - Use `AddEventingSubscriber()` instead - `AddLifecycleHook(Func)` - Use `AddEventingSubscriber(Func)` instead - `TryAddLifecycleHook()` - Use `TryAddEventingSubscriber()` instead - `TryAddLifecycleHook(Func)` - Use `TryAddEventingSubscriber(Func)` instead **Publishing interfaces** (use `aspire do` instead): + - `IDistributedApplicationPublisher` - Use `PipelineStep` instead - `PublishingOptions` - Use `PipelineOptions` instead **Node.js/JavaScript APIs** (use new JavaScript hosting instead): + - `AddNpmApp()` - Use `AddJavaScriptApp()` instead for general npm-based apps, or `AddViteApp()` for Vite projects :::note[Migrating from AddNpmApp] @@ -1512,6 +1564,7 @@ While the obsoleted APIs still work in 13.0, they will be removed in the next ma ### Changed signatures **AllocatedEndpoint constructor**: + ```csharp {5,9,12} // Before (9.x) var endpoint = new AllocatedEndpoint( @@ -1521,13 +1574,14 @@ var endpoint = new AllocatedEndpoint( // After (13.0) var endpoint = new AllocatedEndpoint( - endpointAnnotation, - "http", - 8080, + endpointAnnotation, + "http", + 8080, networkIdentifier: KnownNetworkIdentifiers.LocalhostNetwork); ``` **ParameterProcessor constructor**: + ```csharp {8,17} // Before (9.x) var processor = new ParameterProcessor( @@ -1549,15 +1603,18 @@ var processor = new ParameterProcessor( ``` **InteractionInput property changes**: + - `MaxLength`: Changed from settable to init-only. - `Options`: Changed from init-only to settable. - `Placeholder`: Changed from settable to init-only. **WithReference for IResourceWithServiceDiscovery**: + - Added new overload with `name` parameter for named references. - Existing overload still available for compatibility. **ProcessArgumentValuesAsync and ProcessEnvironmentVariableValuesAsync**: + ```csharp // Before (9.x) await resource.ProcessArgumentValuesAsync( @@ -1572,6 +1629,7 @@ await resource.ProcessArgumentValuesAsync( The `containerHostName` parameter has been removed. Network context is now handled through `NetworkIdentifier`. **EndpointReference.GetValueAsync behavior change**: + ```csharp // Before (9.x) - would throw immediately if not allocated var value = await endpointRef.GetValueAsync(cancellationToken); @@ -1591,12 +1649,14 @@ var value = await endpointRef.GetValueAsync(cancellationToken); Aspire 13.0 introduces a major architectural change to enable universal container-to-host communication, independent of container orchestrator support. **What changed:** + - Leverages DCP's container tunnel capability for container-to-host connectivity. - `EndpointReference` resolution is now context-aware (uses `NetworkIdentifier`). - Endpoint references are tracked by their `EndpointAnnotation`. - `AllocatedEndpoint` constructor signature changed. **Impact:** + - Enables containers to communicate with host-based services reliably across all deployment scenarios. - Code that directly constructs `AllocatedEndpoint` objects will need updates. - Extension methods that process endpoint references may need Network Identifier context. @@ -1714,6 +1774,7 @@ If you were relying on `EnvironmentCredential` or `WorkloadIdentityCredential` i #### Migrating from publishing callbacks to pipeline steps **Before (9.x)**: + ```csharp var api = builder.AddProject("api") .WithPublishingCallback(async (context, cancellationToken) => @@ -1723,6 +1784,7 @@ var api = builder.AddProject("api") ``` **After (13.0)**: + ```csharp var api = builder.AddProject("api") .WithPipelineStepFactory(context => @@ -1741,6 +1803,7 @@ For more details, see [Deployment pipeline documentation](/get-started/pipelines #### Migrating from lifecycle hooks to events **Before (9.x)**: + ```csharp public class MyLifecycleHook : IDistributedApplicationLifecycleHook { @@ -1756,12 +1819,13 @@ builder.Services.TryAddLifecycleHook(); ``` **After (13.0)**: + ```csharp public class MyEventSubscriber : IDistributedApplicationEventingSubscriber { public Task SubscribeAsync( - IDistributedApplicationEventing eventing, - DistributedApplicationExecutionContext executionContext, + IDistributedApplicationEventing eventing, + DistributedApplicationExecutionContext executionContext, CancellationToken cancellationToken) { eventing.Subscribe((@event, ct) => From a20eb7e394a90bfaba90ec515aa750997aaf14a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:12:32 +0000 Subject: [PATCH 4/4] Address code review feedback: improve wording and consistency Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> --- src/frontend/src/content/docs/whats-new/aspire-13.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/content/docs/whats-new/aspire-13.mdx b/src/frontend/src/content/docs/whats-new/aspire-13.mdx index 44025722..602b8a44 100644 --- a/src/frontend/src/content/docs/whats-new/aspire-13.mdx +++ b/src/frontend/src/content/docs/whats-new/aspire-13.mdx @@ -1719,7 +1719,7 @@ Aspire 13.0 changes the default behavior of `DefaultAzureCredential` when deploy **What changed:** -When you deploy to Azure Container Apps or Azure App Service, Aspire now automatically sets the `AZURE_TOKEN_CREDENTIALS` environment variable to `managedidentity`. This forces `DefaultAzureCredential` to behave deterministically by only using `ManagedIdentityCredential`, instead of attempting other credential types like `EnvironmentCredential` or `WorkloadIdentityCredential` first. +When you deploy to Azure Container Apps or Azure App Service, Aspire now automatically sets the `AZURE_TOKEN_CREDENTIALS` environment variable to `managedidentity`. This configures `DefaultAzureCredential` to behave deterministically by only using `ManagedIdentityCredential`, instead of attempting other credential types like `EnvironmentCredential` or `WorkloadIdentityCredential` first. **Why this change:** @@ -1744,7 +1744,7 @@ When you deploy to Azure Container Apps or Azure App Service, Aspire now automat If you were relying on `EnvironmentCredential` or `WorkloadIdentityCredential` in your application, choose one of the following options: -1. **Use explicit credentials**: Don't use `DefaultAzureCredential` in your application. Instead, explicitly use the specific credential type you need (e.g., `EnvironmentCredential` or `WorkloadIdentityCredential`). +1. **Use explicit credentials**: Do not use `DefaultAzureCredential` in your application. Instead, explicitly use the specific credential type you need (e.g., `EnvironmentCredential` or `WorkloadIdentityCredential`). 2. **Remove the environment variable**: Implement a callback to remove the `AZURE_TOKEN_CREDENTIALS` environment variable from the deployment: