Dette indhold er ikke tilgængeligt i dit sprog endnu.
📢 Aspire 13 represents a major milestone in the Aspire product line.
Aspire is no longer ”.NET Aspire” - it’s now simply Aspire, a full multi-language application platform. While Aspire continues to provide best-in-class support for .NET applications, version 13.0 elevates Python and JavaScript to first-class citizens, with comprehensive support for running, debugging, and deploying applications written in these languages.
This release introduces:
First-class Python support: Support for Python modules, deploy with uvicorn, flexible package management (uv, pip, or venv), and generate production Dockerfiles automatically.
First-class JavaScript support: Vite and npm-based apps with package manager auto-detection, debugging support, and container-based build pipelines.
Multi-language infrastructure: Connection properties work in any language (URI, JDBC, individual properties), certificate trust across languages and containers.
Container files as build artifacts: A new paradigm where build outputs are containers, not folders - enabling reproducible, isolated, and portable builds.
aspire do: a new platform for build, publish and deployment pipelines: enabling parallel execution, dependency tracking, and extensible workflows for building, publishing, and deploying applications.
Modern CLI: aspire init to add Aspire to existing apps, and improved deployment state management that remembers your configuration across runs.
VS Code extension: Streamlined Aspire development with commands for project creation, integration management, multi-language debugging, and deployment.
Along with the rebranding, Aspire now has a new home at aspire.dev — your central hub for documentation, getting started guides, and community resources.
Requirements:
.NET 10 SDK or later.
If you have feedback, questions, or want to contribute to Aspire, collaborate with us on GitHub or join us on our new Discord to chat with the team and other community members.
Aspire 13.0 introduces a simplified AppHost project template structure. The SDK now encapsulates the Aspire.Hosting.AppHost package, resulting in cleaner project files.
Simplified SDK declaration: The SDK is now specified directly in the <Project> tag with its version: Sdk="Aspire.AppHost.Sdk/13.0.0".
No explicit Aspire.Hosting.AppHost reference: The SDK now automatically includes this package, reducing boilerplate.
Cleaner structure: Removed the separate <Sdk Name="..." /> element and the Microsoft.NET.Sdk base SDK.
Target framework: Updated from net9.0 to net10.0.
The aspire update command automatically handles this migration when upgrading from 9.x to 13.0.
[!TIP]
For an even simpler setup, Aspire 13.0 also supports single-file AppHosts that don’t require a project file at all. Single-file AppHosts are perfect for quick prototypes and learning scenarios.
The same project as a file-based AppHost:
apphost.cs
#:sdk Aspire.AppHost.Sdk@13.0.0
#:package Aspire.Hosting.Redis@13.0.0
var builder =DistributedApplication.CreateBuilder(args);
var cache =builder.AddRedis("cache");
var api =builder.AddProject("apiservice","../MyApi")
.WithReference(cache);
builder.Build().Run();
No project file needed - just a single .cs file with package references declared using #:package directives.
Aspire 13.0 marks a transformative shift from a .NET-centric orchestration tool to a truly multi-language application platform. Python and JavaScript are now first-class citizens alongside .NET, with comprehensive support for development, debugging, and deployment workflows.
Aspire 13.0 introduces comprehensive Python support, making it effortless to build, debug, and deploy Python applications alongside your other services.
Aspire 13.0 provides flexible Python package management with automatic detection.
Automatic package manager detection:
When you add a Python app, Aspire automatically detects and configures package management:
C# — Automatic package detection
// If pyproject.toml or requirements.txt exists → automatically uses pip
// If neither exists → creates a virtual environment (.venv)
var api =builder.AddUvicornApp("api","./api","main:app");
In most cases, you don’t need to explicitly configure package management—Aspire detects it automatically.
Using uv (recommended for new projects):
For modern Python projects using uv, explicitly opt-in with WithUv():
C# — Using uv for package management
builder.AddUvicornApp("api","./api","main:app")
.WithUv();// Use uv for package management
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).
Auto-detects Python version from project configuration.
Explicit pip configuration:
To explicitly configure pip behavior, use WithPip():
C# — Using pip for package management
builder.AddUvicornApp("api","./api","main:app")
.WithPip();// Explicitly use pip for package management
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.
Configuring virtual environment path:
By default, Aspire uses .venv in the app directory as the virtual environment path. Use WithVirtualEnvironment() to specify a custom path or control automatic creation:
By default, createIfNotExists is true, so Aspire will create the virtual environment if it doesn’t exist. Set it to false to require the virtual environment to already exist.
Python applications can be debugged directly in VS Code with full breakpoint support. Aspire 13.0 automatically enables debugging infrastructure for all Python resources - no additional configuration required. See Visual Studio Code extension for more.
Supported debugging scenarios:
Python scripts: Debug AddPythonApp with breakpoints and variable inspection.
Python modules: Debug AddPythonModule with module resolution.
Flask applications: Debug Flask apps with auto-reload.
Uvicorn/FastAPI: Debug ASGI applications with async/await support.
[!NOTE]
Debugging is automatically enabled for Python resources. The Aspire VS Code extension generates VS Code launch configurations automatically.
Aspire 13.0 includes a new aspire-py-starter template that demonstrates a full-stack Python application:
Bash — Create Python starter template
aspirenewaspire-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.
Redis caching (optional): A distributed cache across requests.
Container files: Frontend static files served by the Python backend.
Build a full-stack multi-language app—Python backend + JavaScript frontend—fast. Use aspire new aspire-py-starter to generate it, then explore the Python integration and JavaScript integration guides.
The React frontend communicates with the FastAPI backend via HTTP endpoints, demonstrating seamless integration between the two languages within a single Aspire application. The new template has a modern UX:
Aspire 13.0 refactors and expands JavaScript support. In earlier versions, the Aspire.Hosting.NodeJs integration enabled JavaScript applications. In Aspire 13.0, the integration was renamed to Aspire.Hosting.JavaScript and it introduces AddJavaScriptApp as the foundational method for all JavaScript applications.
Aspire automatically detects and supports multiple JavaScript package managers with intelligent defaults for both development and production scenarios.
Auto-install by default:
Starting in Aspire 13.0, package managers automatically install dependencies by default (install = true). This ensures dependencies are always up-to-date during development and publishing.
Smart defaults for deterministic builds:
When publishing (production mode), Aspire automatically uses deterministic install commands based on the presence of lockfiles:
npm: Uses npm ci if package-lock.json exists, otherwise npm install.
yarn:
Uses yarn install --immutable if yarn.lock exists and yarn v2+ is detected, otherwise.
Uses yarn install --frozen-lockfile if yarn.lock exists, otherwise yarn install.
Unlike the deprecated AddNpmApp API, AddJavaScriptApp does not support an args constructor parameter for passing command-line arguments directly to scripts. You have two options to pass arguments:
Option 2 keeps all script configuration in package.json, making your scripts more discoverable and easier to run outside of Aspire (e.g., npm run hasura:console).
When you reference a database resource with WithReference, Aspire automatically exposes multiple connection properties as environment variables. For example, a PostgreSQL resource named db exposes:
DB_URI - PostgreSQL URI format: postgresql://user:pass@host:port/dbname.
The JDBC connection string does not include credentials for security best practices. Use the separate DB_USERNAME and DB_PASSWORD environment variables to authenticate, or configure your JDBC driver to use these properties.
This pattern works for all supported databases (PostgreSQL, SQL Server, Oracle, MySQL, MongoDB, etc.) with appropriate URI and JDBC formats for each.
[!NOTE]
These new connection property conventions are available in the built-in Aspire database integrations (PostgreSQL, SQL Server, Oracle, MySQL, MongoDB, etc.). If you have custom or community integrations, they may need to be updated to expose these properties. See the connection properties agent documentation for guidance on implementing these conventions in your own integrations.
Aspire 13.0 automatically configures ASP.NET Development Certificate trust for Python, Node.js, and containerized applications without any additional configuration:
C# — Certificate trust across languages
// Python applications automatically trust development certificates
var pythonApi =builder.AddUvicornApp("api","./api","main:app");
// Node.js applications automatically trust development certificates
var nodeApi =builder.AddJavaScriptApp("frontend","./frontend");
// Containerized applications automatically trust development certificates
var container =builder.AddContainer("service","myimage");
Aspire automatically:
Python: Configures SSL_CERT_FILE and REQUESTS_CA_BUNDLE environment variables.
Aspire 13.0 introduces multi-language-friendly environment variables that make service discovery easier for apps that consume environment variables directly.
C# — Simplified service URL environment variables
var builder =DistributedApplication.CreateBuilder(args);
var api =builder.AddProject<Projects.Api>("api");
// Python app gets simple environment variables
var pythonApp =builder.AddPythonModule("worker","./worker","worker.main")
.WithReference(api);// Sets API and API_HTTPS env vars
awaitbuilder.Build().RunAsync();
Instead of complex service discovery formats, these apps receive simple environment variables:
API_HTTP=http://localhost:5000—HTTP endpoint.
API_HTTPS=https://localhost:5001—HTTPS endpoint.
This feature makes Aspire’s service discovery mechanism accessible to any programming language, not just .NET applications with service discovery libraries.
The new aspire init command provides a streamlined, interactive experience for initializing Aspire solutions with comprehensive project setup and configuration.
# Initialize a new Aspire solution - interactive prompts guide you through setup
aspireinit
When you run aspire init, the CLI will:
Discover existing solutions: Automatically finds and updates solution files in the current directory.
Create single-file AppHost: If no solution exists, creates a single-file AppHost for quick starts.
Add projects intelligently: Prompts to add projects to your app host.
Configure service defaults: Sets up service defaults referencing automatically.
Setup NuGet.config: Creates package source mappings for Aspire packages.
Manage template versions: Interactively selects the appropriate template version.
The init command simplifies the initial project setup through an interactive workflow that ensures consistent configuration across team members.
[!NOTE]
The aspire init command sets up the Aspire project structure and configuration, but does not automatically add resources (databases, caches, message queues, etc.) to your AppHost. You’ll need to manually add resource definitions to your AppHost code using methods like AddPostgres, AddRedis, AddRabbitMQ, etc.
Aspire 13.0 refocuses aspire new around curated starter templates that demonstrate different application patterns. The command now provides an interactive experience designed to help you get started quickly with ready-to-run examples.
Terminal window
aspirenew
When you run the command, you’ll see an interactive menu to select a starter template:
Empty AppHost: Minimal single-file AppHost for custom applications.
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.
Aspire 13.0 includes a new Aspire VS Code extension which brings Aspire CLI features to VS Code. It provides commands to create and debug projects, add integrations, configure launch settings, and manage deployments directly from the Command Palette.
[!NOTE]
To use most extension features, the Aspire 13.0 CLI must be installed and available on the user PATH. You can verify this by running aspire --version in a VS Code terminal. For installation steps, see Upgrade to Aspire 13.0.
Key features:
Debug Python and C# projects inside VS Code: Launch your apphost using the Aspire debugger to launch and debug any C# and Python resources in your app.
Project creation: Use Aspire: New Aspire project to create new Aspire projects from templates.
Integration management: Use Aspire: Add an integration to add Aspire integrations to your AppHost.
Launch configuration: Use Aspire: Configure launch.json to automatically set up a VS Code launch configuration.
Configuration management: Use Aspire: Manage configuration settings to configure Aspire CLI settings.
Publish and deployment: Use Aspire: Publish deployment artifacts and Aspire: Deploy app commands (preview).
Open the Command Palette (Command + Shift + PCommandShiftPControl + Shift + PCtrlShiftPControl + Shift + PCtrlShiftP).
Type “Aspire” to see all available commands.
Use Aspire: Configure launch.json to set up debugging for your AppHost.
The extension requires the Aspire CLI to be installed and available on your PATH. All commands are grouped under the Aspire category in the Command Palette for easy discovery.
Aspire 13.0 introduces comprehensive support for single-file app hosts, allowing you to define your entire distributed application in a single .cs file without a project file.
C# — Single-file AppHost
// apphost.cs
#:sdk Aspire.AppHost.Sdk@13.0.0
#:package Aspire.Hosting.PostgreSQL@13.0.0
var builder =DistributedApplication.CreateBuilder(args);
var database =builder.AddPostgres("postgres");
builder.AddProject<Projects.Api>("api")
.WithReference(database);
awaitbuilder.Build().RunAsync();
Single-file app host support includes:
Template support: Use the aspire-apphost-singlefile template via aspire new.
Full CLI integration: Works seamlessly with aspire run, aspire deploy, aspire publish, aspire add, aspire update.
Launch profile support: Full debugging and launch configuration support.
[!NOTE]
Single-file app hosts require .NET 10.0 SDK or later.
The --non-interactive flag disables prompts and interactive progress indicators for CI/CD scenarios. The CLI automatically detects common CI environments and enables this mode. You can also set ASPIRE_NON_INTERACTIVE=true or use --non-interactive explicitly.
[!NOTE]
Not all commands support non-interactive mode. Commands that require user input will fail if the --non-interactive flag is set and required values are not provided through other means.
For advanced deployment workflows, see aspire do, which introduces a comprehensive pipeline system for coordinating build, deployment, and publishing operations.
Aspire 13.0 introduces aspire do - a comprehensive system for coordinating build, deployment, and publishing operations. This new architecture provides a foundation for orchestrating complex deployment workflows with built-in support for step dependencies, parallel execution, and detailed progress reporting.
The aspire do system replaces the previous publishing infrastructure with a more flexible, extensible model that allows resource-specific deployment logic to be decentralized and composed into larger workflows.
[!IMPORTANT]
🧪 Early Preview: The pipeline APIs are in early preview and marked as experimental. See aspire do command reference for more information.
The Aspire AppHost defines a global DistributedApplicationPipeline instance on the DistributedApplicationBuilder that can be used to register steps in the pipeline at the top-level.
C# — Custom pipeline step
var builder =DistributedApplication.CreateBuilder(args);
Steps registered in the pipeline can be run via the CLI:
Bash — Run custom pipeline step
aspiredovalidate
The pipeline system supports global steps, resource-specific steps, dependency configuration, parallel execution, and built-in logging. Resources can contribute their own steps via WithPipelineStepFactory and control ordering with WithPipelineConfiguration.
Aspire 13.0 introduces the ability to extract files from one resource’s container and copy them into another resource’s container during the build process. This enables powerful patterns like building a frontend in one container and serving it from a backend in another container.
C# — Container files as build artifacts
var frontend =builder.AddViteApp("frontend","./frontend");
var api =builder.AddUvicornApp("api","./api","main:app");
// Extract files FROM the frontend container and copy TO the 'static' folder
This pattern works with any resource types (C#, Python, JavaScript) and integrates seamlessly with aspire do for dependency tracking, parallel execution, and incremental builds.
Aspire 13.0 introduces an experimental programmatic Dockerfile generation API that allows you to define Dockerfiles using C# code with a composable, type-safe API.
[!IMPORTANT]
🧪 Experimental Feature: The Dockerfile Builder API is experimental and may change before general availability.
Features include loading from PEM files or certificate stores, flexible trust scoping, customizable container paths, and automatic dev certificate trust configuration.
Aspire 13.0 introduces a new Aspire.Hosting.Maui package that enables orchestrating .NET MAUI mobile applications alongside your cloud services.
C# — AppHost.cs
var builder =DistributedApplication.CreateBuilder(args);
var api =builder.AddProject<Projects.Api>("api");
// 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()
.WithReference(api.GetEndpoint("https"));
// Add the .NET MAUI project resource
var mauiapp =builder.AddMauiProject("myapp",@"../MyApp/MyApp.csproj");
// Add MAUI app for Windows
mauiapp.AddWindowsDevice()
.WithReference(api);
// Add MAUI app for Mac Catalyst
mauiapp.AddMacCatalystDevice()
.WithReference(api);
// 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
// default emulator (uses running or default emulator, needs to be started)
mauiapp.AddAndroidEmulator()
.WithOtlpDevTunnel()// Needed to get the OpenTelemetry data to "localhost"
.WithReference(api,publicDevTunnel);// Needs a dev tunnel to reach "localhost"
builder.Build().Run();
MAUI integration features:
Platform support: Windows, Mac Catalyst, Android, and iOS
Device registration: Register multiple device instances for testing
Platform validation: Automatically detects host OS compatibility and marks resources as unsupported when needed
Full orchestration: MAUI apps participate in service discovery and can reference backend services
This enables a complete mobile + cloud development experience where you can run and debug your mobile app alongside your backend services in a single Aspire project.
The Dashboard now includes an MCP server that integrates Aspire into your AI development ecosystem. The MCP server enables AI assistants to query resources, access telemetry data, and execute commands directly from your development environment.
Getting started:
Run your Aspire app and open the dashboard.
Click the MCP button in the top right corner.
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.
Available tools:
list_resources—Retrieve all resources with state, endpoints, environment variables, and metadata.
list_console_logs—Access resource console output.
list_structured_logs—Retrieve telemetry data, optionally filtered by resource.
list_traces—Access distributed trace information.
list_trace_structured_logs—View logs associated with specific traces.
execute_resource_command—Execute commands on resources.
This enables AI assistants to directly interact with your Aspire applications, analyze telemetry in real-time, and provide intelligent insights during development.
Interaction services dynamic inputs and comboboxes
Aspire is going multi-language 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.
Resources in the dashboard have accent colors, which is used to color their icon and telemetry. Accent colors are now more FluentUI-ish (saturation++) with custom tweaks for light and dark themes.
The dark blue accent color is no longer almost invisible on a dark background!
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.
Aspire 13.0 adds first-class support for C# file-based applications, enabling you to add C# apps without full project files to your distributed application.
apphost.cs
#:sdk Aspire.AppHost.Sdk@13.0.0
#:package Aspire.Hosting.Redis@13.0.0
// Type is for evaluation purposes only and is subject to change or
// removal in future updates. Suppress this diagnostic to proceed.
#pragmawarningdisable ASPIRECSHARPAPPS001
var builder =DistributedApplication.CreateBuilder(args);
This works seamlessly with .NET 10 SDK’s file-based application support. The C# file-based app can use service discovery, access referenced resources, and be debugged in VS Code just like regular projects.
The interaction service has been improved with support for dynamic inputs. This feature allows inputs to load options based on other input values, enabling cascading dropdowns and dependent parameter prompting.
[!NOTE]
This is an experimental feature marked with [Experimental("ASPIREINTERACTION001")].
var inputs =newList<InteractionInput>
{
// First input - static options
newInteractionInput
{
Name="DatabaseType",
InputType=InputType.Choice,
Label="Database Type",
Required=true,
Options=
[
KeyValuePair.Create("postgres","PostgreSQL"),
KeyValuePair.Create("mysql","MySQL"),
KeyValuePair.Create("sqlserver","SQL Server")
]
},
// Second input - loads dynamically based on DatabaseType
newInteractionInput
{
Name="DatabaseVersion",
InputType=InputType.Choice,
Label="Database Version",
Required=true,
DynamicLoading=newInputLoadOptions
{
LoadCallback=async(context)=>
{
var dbType =context.AllInputs["DatabaseType"].Value;
Features include callback-based loading (LoadCallback), dependency tracking (DependsOnInputs), access to other input values (context.AllInputs), and async support for loading from APIs or databases.
Choice inputs can be configured to accept custom choices by setting AllowCustomChoice to true. In the dashboard, these inputs are displayed as a combobox.
This is useful when your application needs individual connection components rather than a full connection string, or when building connection strings in formats Aspire doesn’t provide natively.
Aspire 13.0 completely reimplements the deployment workflow on top of aspire do. This architectural change transforms deployment from a monolithic operation into a composable set of discrete, parallelizable steps.
The new deployment pipeline automatically parallelizes independent operations, dramatically reducing deployment time. Steps like prerequisites, builds, and provisioning run concurrently when dependencies allow.
Granular step control:
Execute individual deployment phases using aspire do:
Terminal window
aspiredobuild# Build all containers
aspiredeploy# Complete deployment
aspiredodeploy--pipeline-log-leveldebug# Deploy with verbose logging
This enables incremental deployments, debugging specific steps, and CI/CD pipeline splitting. Use --pipeline-log-level debug for detailed troubleshooting output.
Pipeline diagnostics:
Use the --list-steps flag (available on aspire deploy, aspire publish, aspire destroy, and aspire do) to inspect the pipeline that would run for a given command — including step order, dependencies, and the resources each step targets — without actually executing it.
Benefits:
The pipeline-based deployment provides dependency tracking, real-time progress reporting, failure isolation, selective execution, extensibility, and built-in diagnostics.
Aspire 13.0 introduces deployment state management that automatically persists deployment information locally across runs. When you deploy to Azure, Aspire now remembers your choices and deployment state between sessions.
What persists locally:
Azure configuration: Subscription, resource group, location, and tenant selections
Parameter values: Input values from previous deployments
Deployed resources: Track what’s been deployed and where
User experience:
Terminal window
# First deployment - you're prompted for configuration, assumes "Production" environment
# Subsequent deployments - no prompts, uses saved state
aspiredeploy
# Uses previous selections automatically
# First deployment to a different environment -- prompted again
aspiredeploy--environmentstaging
This eliminates repetitive prompts and makes iterative deployments faster. Your deployment configuration is stored locally (not in source control), so each developer can have their own Azure configuration without conflicts.
Example workflow:
First time: Select subscription “My Subscription”, resource group “my-rg”, location “eastus”
Deploy completes, state saved locally
Make code changes
Run aspire deploy again - automatically uses “My Subscription”, “my-rg”, “eastus”
No need to re-enter configuration
Storage location:
The state is stored in your local user profile at:
The <project-hash> is a SHA256 hash of your AppHost project path, allowing different projects to maintain separate state. The <environment> corresponds to the deployment environment (e.g., production, development).
This location is excluded from source control by design, so each developer can have their own Azure configuration without conflicts.
Resetting deployment state:
If you need to reset your deployment state (for example, to change subscriptions or start fresh), use the --clear-cache flag:
Terminal window
aspiredeploy--clear-cache
# Clears saved state and prompts for configuration again
This removes all saved deployment state, including Azure configuration, parameter values, and deployment context. The next deployment will prompt you for all configuration values as if it were the first deployment.
Aspire 13.0 introduces interactive tenant selection during Azure provisioning, fixing issues with multi-tenant scenarios (work and personal accounts).
When provisioning Azure resources, if multiple tenants are available, the CLI will prompt you to select the appropriate tenant. The tenant selection is stored alongside your subscription, location, and resource group choices for consistent deployments.
Terminal window
aspiredeploy
# If you have multiple tenants, you'll be prompted:
The Aspire Dashboard is now included by default when deploying to Azure App Service, giving you visibility into your deployed applications:
builder.AddAzureAppServiceEnvironment("env");
// Dashboard is included by default at https://[prefix]-aspiredashboard-[unique string].azurewebsites.net
The deployed dashboard provides the same experience as local development: view logs, traces, metrics, and application topology for your production environment.
The Aspire.Hosting.NodeJs package has been renamed to Aspire.Hosting.JavaScript to better reflect its broader support for JavaScript applications (Node.js, Vite, etc.).
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.
Migration:
The universal container-to-host communication is currently an experimental feature and needs to be enabled via environment variable. Set ASPIRE_ENABLE_CONTAINER_TUNNEL to true to opt in.
This change fixes long-standing issues with container-to-host communication (issue #6547).
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 ManagedIdentityCredential. This configures 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.
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 ManagedIdentityCredential.
Affected APIs:
AddAzureContainerAppEnvironment
AddAzureAppServiceEnvironment
Migration:
If you were relying on EnvironmentCredential or WorkloadIdentityCredential in your application, choose one of the following options:
Use explicit credentials: Do not use DefaultAzureCredential in your application. Instead, explicitly use the specific credential type you need (e.g., EnvironmentCredential or WorkloadIdentityCredential).
Remove the environment variable: Implement a callback to remove the AZURE_TOKEN_CREDENTIALS environment variable from the deployment:
// For Azure Container Apps
builder.AddProject<Projects.Frontend>("frontend")
.PublishAsAzureContainerApp((infra, app)=>
{
var containerAppContainer =app.Template.Containers[0].Value!;
var azureTokenCredentialEnv =containerAppContainer.Env