diff --git a/docs/app-host/configuration.md b/docs/app-host/configuration.md index 8485526328..9bf94c2172 100644 --- a/docs/app-host/configuration.md +++ b/docs/app-host/configuration.md @@ -55,6 +55,7 @@ For more information, see [.NET Aspire and launch profiles](../fundamentals/laun |--|--|--| | `ASPIRE_ALLOW_UNSECURED_TRANSPORT` | `false` | Allows communication with the app host without https. `ASPNETCORE_URLS` (dashboard address) and `ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL` (app host resource service address) must be secured with HTTPS unless true. | | `ASPIRE_CONTAINER_RUNTIME` | `docker` | Allows the user of alternative container runtimes for resources backed by containers. Possible values are `docker` (default) or `podman`. See [Setup and tooling overview for more details](../fundamentals/setup-tooling.md). | +| `ASPIRE_VERSION_CHECK_DISABLED` | `false` | When set to `true`, .NET Aspire doesn't check for newer versions on startup. | ## Resource service diff --git a/docs/app-host/eventing.md b/docs/app-host/eventing.md index 827c6cc352..e1e84da1cf 100644 --- a/docs/app-host/eventing.md +++ b/docs/app-host/eventing.md @@ -1,7 +1,7 @@ --- title: Eventing in .NET Aspire description: Learn how to use the .NET eventing features with .NET Aspire. -ms.date: 04/04/2025 +ms.date: 07/10/2025 --- # Eventing in .NET Aspire @@ -17,48 +17,55 @@ In this article, you learn how to use the eventing features in .NET Aspire. The following events are available in the app host and occur in the following order: 1. : This event is raised before the app host starts. -1. : This event is raised after the app host allocated endpoints. +1. : This event is raised per resource after its endpoints are allocated. 1. : This event is raised after the app host created resources. All of the preceding events are analogous to the [app host life cycles](xref:dotnet/aspire/app-host#app-host-life-cycles). That is, an implementation of the could handle these events just the same. With the eventing API, however, you can run arbitrary code when these events are raised and event define custom events—any event that implements the interface. ### Subscribe to app host events -To subscribe to the built-in app host events, use the eventing API. After you have a distributed application builder instance, walk up to the property and call the API. Consider the following sample app host _Program.cs_ file: +To subscribe to the built-in app host events, use the eventing API. After you have a distributed application builder instance, walk up to the property and call the API. Consider the following sample app host _AppHost.cs_ file: -:::code source="snippets/AspireApp/AspireApp.AppHost/Program.cs"::: +:::code source="snippets/AspireApp/AspireApp.AppHost/AppHost.cs"::: The preceding code is based on the starter template with the addition of the calls to the `Subscribe` API. The `Subscribe` API returns a instance that you can use to unsubscribe from the event. It's common to discard the returned subscriptions, as you don't usually need to unsubscribe from events as the entire app is torn down when the app host is shut down. When the app host is run, by the time the .NET Aspire dashboard is displayed, you should see the following log output in the console: -:::code language="Plaintext" source="snippets/AspireApp/AspireApp.AppHost/Console.txt" highlight="2,10-14,20"::: +:::code language="Plaintext" source="snippets/AspireApp/AspireApp.AppHost/Console.txt" highlight="2,10,12,14,16,22"::: -The log output confirms that event handlers are executed in the order of the app host life cycle events. The subscription order doesn't affect execution order. The `BeforeStartEvent` is triggered first, followed by `AfterEndpointsAllocatedEvent`, then each resource has its `ResourceEndpointsAllocatedEvent` event fired, and finally `AfterResourcesCreatedEvent`. +The log output confirms that event handlers are executed in the order of the app host life cycle events. The subscription order doesn't affect execution order. The `BeforeStartEvent` is triggered first, followed by each resource's `ResourceEndpointsAllocatedEvent`, and finally `AfterResourcesCreatedEvent`. ## Resource eventing In addition to the app host events, you can also subscribe to resource events. Resource events are raised specific to an individual resource. Resource events are defined as implementations of the interface. The following resource events are available in the listed order: -1. `InitializeResourceEvent`: Raised by orchestrators to signal to resources that they should initialize themselves. +1. : Raised by orchestrators to signal to resources that they should initialize themselves. +1. : Raised when the orchestrator allocates endpoints for a resource. 1. : Raised when a connection string becomes available for a resource. 1. : Raised before the orchestrator starts a new resource. 1. : Raised when a resource initially transitions to a ready state. ### Subscribe to resource events -To subscribe to resource events, use the eventing API. After you have a distributed application builder instance, walk up to the property and call the API. Consider the following sample app host _Program.cs_ file: +To subscribe to resource events, use the convenience-based extension methods—`On*`. After you have a distributed application builder instance, and a resource builder, walk up to the instance and chain a call to the desired `On*` event API. Consider the following sample app host _AppHost.cs_ file: -:::code source="snippets/AspireApp/AspireApp.ResourceAppHost/Program.cs"::: +:::code source="snippets/AspireApp/AspireApp.ResourceAppHost/AppHost.cs"::: -The preceding code subscribes to the `InitializeResourceEvent`, `ResourceReadyEvent`, `ConnectionStringAvailableEvent`, and `BeforeResourceStartedEvent` events on the `cache` resource. When is called, it returns an where `T` is a . The resource builder exposes the resource as the property. The resource in question is then passed to the `Subscribe` API to subscribe to the events on the resource. +The preceding code subscribes to the `InitializeResourceEvent`, `ResourceReadyEvent`, `ResourceEndpointsAllocatedEvent`, `ConnectionStringAvailableEvent`, and `BeforeResourceStartedEvent` events on the `cache` resource. When is called, it returns an where `T` is a . Chain calls to the `On*` methods to subscribe to the events. The `On*` methods return the same instance, so you can chain multiple calls: + +- `OnInitializeResource`: Subscribes to the event. +- `OnResourceEndpointsAllocated`: Subscribes to the event. +- `OnConnectionStringAvailable`: Subscribes to the event. +- `OnBeforeResourceStarted`: Subscribes to the event. +- `OnResourceReady`: Subscribes to the event. When the app host is run, by the time the .NET Aspire dashboard is displayed, you should see the following log output in the console: -:::code language="Plaintext" source="snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt" highlight="8,10,12,18"::: +:::code language="Plaintext" source="snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt" highlight="8,10,12,14,20"::: > [!NOTE] -> Some events are blocking. For example, when the `BeforeResourceStartEvent` is published, the startup of the resource will be blocked until all subscriptions for that event on a given resource have completed executing. Whether an event is blocking or not depends on how it is published (see the following section). +> Some events block execution. For example, when the `BeforeResourceStartedEvent` is published, the resource startup blocks until all subscriptions for that event on a given resource finish executing. Whether an event blocks or not depends on how you publish it (see the following section). ## Publish events @@ -74,7 +81,7 @@ Then, you can subscribe and publish the event by calling the either of the follo When events are dispatched, you can control how the events are dispatched to subscribers. The event dispatch behavior is specified with the `EventDispatchBehavior` enum. The following behaviors are available: - : Fires events sequentially and blocks until they're all processed. -- : Fires events concurrently and blocks until they are all processed. +- : Fires events concurrently and blocks until they're all processed. - : Fires events sequentially but doesn't block. - : Fires events concurrently but doesn't block. @@ -82,7 +89,7 @@ The default behavior is `EventDispatchBehavior.BlockingSequential`. To override ## App Host life cycle events -As you have seen, eventing is the most flexible approach. However, in this section you learn about the alternative: life cycle events. +Eventing offers the most flexibility. However, this section explains the alternative: life cycle events. The .NET Aspire app host exposes several life cycles that you can hook into by implementing the interface. The following lifecycle methods are available: @@ -96,7 +103,7 @@ The .NET Aspire app host exposes several life cycles that you can hook into by i To register a life cycle hook, implement the interface and register the hook with the app host using the API: -:::code source="../fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Program.cs"::: +:::code source="../fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AppHost.cs"::: The preceding code: diff --git a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Program.cs b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AppHost.cs similarity index 71% rename from docs/app-host/snippets/AspireApp/AspireApp.AppHost/Program.cs rename to docs/app-host/snippets/AspireApp/AspireApp.AppHost/AppHost.cs index 125ee9ba4b..ab26940f0b 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Program.cs +++ b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AppHost.cs @@ -15,32 +15,21 @@ .WaitFor(apiService); builder.Eventing.Subscribe( - (@event, cancellationToken) => - { - // The event doesn't expose an IServiceProvider, just write to the console. - Console.WriteLine($""" - 3. '{@event.Resource.Name}' ResourceEndpointsAllocatedEvent - """); - - return Task.CompletedTask; - }); - -builder.Eventing.Subscribe( static (@event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("1. BeforeStartEvent"); + logger.LogInformation("2. \"{ResourceName}\" ResourceEndpointsAllocatedEvent", @event.Resource.Name); return Task.CompletedTask; }); -builder.Eventing.Subscribe( +builder.Eventing.Subscribe( static (@event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("2. AfterEndpointsAllocatedEvent"); + logger.LogInformation("1. BeforeStartEvent"); return Task.CompletedTask; }); @@ -50,7 +39,7 @@ { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("4. AfterResourcesCreatedEvent"); + logger.LogInformation("3. AfterResourcesCreatedEvent"); return Task.CompletedTask; }); diff --git a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj index 34bd2e5773..7b36d0e183 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj +++ b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Console.txt b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Console.txt index a3eadd2048..24e01cf25f 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Console.txt +++ b/docs/app-host/snippets/AspireApp/AspireApp.AppHost/Console.txt @@ -1,22 +1,24 @@ info: Program[0] 1. BeforeStartEvent info: Aspire.Hosting.DistributedApplication[0] - Aspire version: 9.3.0-preview.1.25262.2+6d54dc081cd2e7ea435e33f7c0e62ff6946ae66d + Aspire version: 9.4.0 info: Aspire.Hosting.DistributedApplication[0] Distributed application starting. info: Aspire.Hosting.DistributedApplication[0] Application host directory is: ../AspireApp/AspireApp.AppHost info: Program[0] - 2. AfterEndpointsAllocatedEvent - 3. 'aspire-dashboard' ResourceEndpointsAllocatedEvent - 3. 'cache' ResourceEndpointsAllocatedEvent - 3. 'apiservice' ResourceEndpointsAllocatedEvent - 3. 'webfrontend' ResourceEndpointsAllocatedEvent + 2. "cache" ResourceEndpointsAllocatedEvent +info: Program[0] + 2. "apiservice" ResourceEndpointsAllocatedEvent +info: Program[0] + 2. "webfrontend" ResourceEndpointsAllocatedEvent +info: Program[0] + 2. "aspire-dashboard" ResourceEndpointsAllocatedEvent info: Aspire.Hosting.DistributedApplication[0] Now listening on: https://localhost:17178 info: Aspire.Hosting.DistributedApplication[0] Login to the dashboard at https://localhost:17178/login?t= info: Program[0] - 4. AfterResourcesCreatedEvent + 3. AfterResourcesCreatedEvent info: Aspire.Hosting.DistributedApplication[0] Distributed application started. Press Ctrl+C to shut down. diff --git a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Program.cs b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AppHost.cs similarity index 54% rename from docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Program.cs rename to docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AppHost.cs index 0350aa75b3..2b98ae75ab 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Program.cs +++ b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AppHost.cs @@ -5,45 +5,52 @@ var cache = builder.AddRedis("cache"); -builder.Eventing.Subscribe( - cache.Resource, - static (@event, cancellationToken) => +cache.OnResourceReady(static (resource, @event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("4. ResourceReadyEvent"); + logger.LogInformation("5. OnResourceReady"); return Task.CompletedTask; }); -builder.Eventing.Subscribe(cache.Resource, - static (@event, cancellationToken) => +cache.OnInitializeResource( + static (resource, @event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("1. InitializeResourceEvent"); + logger.LogInformation("1. OnInitializeResource"); return Task.CompletedTask; }); -builder.Eventing.Subscribe( - cache.Resource, - static (@event, cancellationToken) => +cache.OnBeforeResourceStarted( + static (resource, @event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("3. BeforeResourceStartedEvent"); + logger.LogInformation("4. OnBeforeResourceStarted"); + + + return Task.CompletedTask; + }); + +cache.OnResourceEndpointsAllocated( + static (resource, @event, cancellationToken) => + { + var logger = @event.Services.GetRequiredService>(); + + logger.LogInformation("2. OnResourceEndpointsAllocated"); return Task.CompletedTask; }); -builder.Eventing.Subscribe( - cache.Resource, - static (@event, cancellationToken) => +cache.OnConnectionStringAvailable( + static (resource, @event, cancellationToken) => { var logger = @event.Services.GetRequiredService>(); - logger.LogInformation("2. ConnectionStringAvailableEvent"); + logger.LogInformation("3. OnConnectionStringAvailable"); return Task.CompletedTask; }); diff --git a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AspireApp.ResourceAppHost.csproj b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AspireApp.ResourceAppHost.csproj index 34bd2e5773..7b36d0e183 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AspireApp.ResourceAppHost.csproj +++ b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/AspireApp.ResourceAppHost.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt index cdfecf5a0b..7724fe58cd 100644 --- a/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt +++ b/docs/app-host/snippets/AspireApp/AspireApp.ResourceAppHost/Console.txt @@ -1,20 +1,22 @@ info: Aspire.Hosting.DistributedApplication[0] - Aspire version: 9.3.0 + Aspire version: 9.4.0 info: Aspire.Hosting.DistributedApplication[0] Distributed application starting. info: Aspire.Hosting.DistributedApplication[0] Application host directory is: ../AspireApp/AspireApp.AppHost info: Program[0] - 1. InitializeResourceEvent + 1. OnInitializeResource info: Program[0] - 2. ConnectionStringAvailableEvent + 2. OnResourceEndpointsAllocated info: Program[0] - 3. BeforeResourceStartedEvent + 3. OnConnectionStringAvailable +info: Program[0] + 4. OnBeforeResourceStarted info: Aspire.Hosting.DistributedApplication[0] Now listening on: https://localhost:17222 info: Aspire.Hosting.DistributedApplication[0] Login to the dashboard at https://localhost:17222/login?t= info: Program[0] - 4. ResourceReadyEvent + 5. OnResourceReady info: Aspire.Hosting.DistributedApplication[0] Distributed application started. Press Ctrl+C to shut down. \ No newline at end of file diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index 096f4617a8..b813b952d8 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -1,7 +1,7 @@ --- title: .NET Aspire architecture overview description: Learn about the overall architecture of .NET Aspire, including its integrations, orchestration, and networking capabilities. -ms.date: 05/09/2025 +ms.date: 07/11/2025 --- # .NET Aspire architecture overview @@ -165,7 +165,9 @@ Continuing from the [diagram in the previous](#app-host-dcp-flow) section, consi :::image type="content" source="media/dcp-architecture-thumb.png" alt-text="A diagram depicting the architecture of the Developer Control Plane (DCP)." lightbox="media/dcp-architecture.png"::: -DCP logs are streamed back to the app host, which then forwards them to the developer dashboard. While the developer dashboard exposes commands such as start, stop, and restart, these commands are not part of DCP itself. Instead, they are implemented by the app model runtime, specifically within its "dashboard service" component. These commands operate by manipulating DCP objects—creating new ones, deleting old ones, or updating their properties. For example, restarting a .NET project involves stopping and deleting the existing representing the project and creating a new one with the same specifications. For more information on commands, see [Custom resource commands in .NET Aspire](../fundamentals/custom-resource-commands.md). +DCP logs are streamed back to the app host, which then forwards them to the developer dashboard. While the developer dashboard exposes commands such as start, stop, and restart, these commands are not part of DCP itself. Instead, they are implemented by the app model runtime, specifically within its "dashboard service" component. These commands operate by manipulating DCP objects—creating new ones, deleting old ones, or updating their properties. For example, restarting a .NET project involves stopping and deleting the existing representing the project and creating a new one with the same specifications. + +For more information on container networking, see [How container networks are managed](../fundamentals/networking-overview.md#how-container-networks-are-managed). ## Developer dashboard diff --git a/docs/compatibility/9.4/add-azure-openai-default-changes.md b/docs/compatibility/9.4/add-azure-openai-default-changes.md new file mode 100644 index 0000000000..76ab3b5226 --- /dev/null +++ b/docs/compatibility/9.4/add-azure-openai-default-changes.md @@ -0,0 +1,52 @@ +--- +title: "Breaking change - AddAzureOpenAI defaults to CognitiveServicesOpenAIUser instead of CognitiveServicesOpenAIContributor" +description: "Learn about the breaking change in .NET Aspire 9.4 where AddAzureOpenAI defaults to a lower privilege role." +ms.date: 7/11/2025 +ai-usage: ai-assisted +ms.custom: https://github.com/dotnet/docs-aspire/issues/3936 +--- + +# AddAzureOpenAI defaults to CognitiveServicesOpenAIUser instead of CognitiveServicesOpenAIContributor + +In .NET Aspire 9.4, the default role assigned to applications using `AddAzureOpenAI` was changed from `CognitiveServicesOpenAIContributor` to `CognitiveServicesOpenAIUser`. This change improves security by assigning a lower privilege role by default, ensuring applications only have the permissions necessary for inference tasks. + +## Version introduced + +.NET Aspire 9.4 + +## Previous behavior + +Previously, applications referencing an Azure OpenAI account were assigned as the `CognitiveServicesOpenAIContributor` role by default. This role allowed applications to manage OpenAI deployments, which is a higher privilege than typically required for inference tasks. + +## New behavior + +Applications referencing an Azure OpenAI account are now assigned the `CognitiveServicesOpenAIUser` role by default. This role provides permissions for inference tasks without allowing management of OpenAI deployments. If higher privileges are required, you can configure the necessary roles using the `WithRoleAssignments` API. + +Example: + +```csharp +using Azure.Provisioning.CognitiveServices; + +var openai = builder.AddAzureOpenAI("openai"); + +builder.AddProject("api") + .WithRoleAssignments(openai, CognitiveServicesBuiltInRole.CognitiveServicesOpenAIContributor); +``` + +## Type of breaking change + +This is a [behavioral change](../categories.md#behavioral-change). + +## Reason for change + +The `CognitiveServicesOpenAIContributor` role provides excessive privileges for most applications, as managing OpenAI deployments isn't typically required. Assigning the `CognitiveServicesOpenAIUser` role by default enhances security by limiting permissions to inference tasks. For applications requiring higher privileges, roles can be explicitly configured using the API. + +For more information, see [GitHub PR #10293](https://github.com/dotnet/aspire/pull/10293). + +## Recommended action + +If your application requires higher privileges than the `CognitiveServicesOpenAIUser` role, explicitly configure the necessary roles using the `WithRoleAssignments` API. See the [New behavior](#new-behavior) section for an example of how to do this. + +## Affected APIs + +- `Aspire.Hosting.AzureOpenAIExtensions.AddAzureOpenAI` diff --git a/docs/compatibility/9.4/azure-bicep-parameters-deprecated.md b/docs/compatibility/9.4/azure-bicep-parameters-deprecated.md new file mode 100644 index 0000000000..64e2f5a812 --- /dev/null +++ b/docs/compatibility/9.4/azure-bicep-parameters-deprecated.md @@ -0,0 +1,116 @@ +--- +title: "Breaking change - Deprecating various known parameters in AzureBicepResource" +description: "Learn about the breaking change in Aspire where known parameter injection in AzureBicepResource has been deprecated." +ms.date: 7/4/2025 +ai-usage: ai-assisted +ms.custom: https://github.com/dotnet/docs-aspire/issues/3675 +--- + +# Deprecating various known parameters in AzureBicepResource + +Known parameter injection in `AzureBicepResource` has been deprecated. The parameters `AzureBicepResource.KnownParameters.KeyVaultName`, `AzureBicepResource.KnownParameters.LogAnalyticsWorkspaceId`, `containerAppEnvironmentId`, and `containerAppEnvironmentName` are now marked as `[Obsolete]` and ignored during infrastructure generation. Developers must explicitly model these resources or use new helper APIs to ensure proper configuration. + +## Version introduced + +This change applies to Aspire starting from version 7.4.2025. + +## Previous behavior + +Previously, Aspire automatically injected the following known parameters into Bicep templates at build time without requiring explicit assignment: + +| Bicep parameter name | Known parameter constant | Typical use | +|--|--|--| +| `keyVaultName` | `KeyVaultName` | Reference a Key Vault for secrets mapped to `AzureBicepResource.GetSecretOutput`. | +| `logAnalyticsWorkspaceId` | `LogAnalyticsWorkspaceId` | Reference the Log Analytics Workspace ID associated with the environment. | +| `containerAppEnvironmentId` | N/A | Reference the container app environment ID. | +| `containerAppEnvironmentName` | N/A | Reference the container app environment name. | + +For example: + +```bicep +// keyvault.bicep +param keyVaultName string +resource kv 'Microsoft.KeyVault/vaults@2023-07-01' = { + name: keyVaultName + ... +} +``` + +```csharp +builder.AddBicepTemplateFile("kv", "keyvault.bicep"); // No parameter assignment needed +builder.AddContainer("api", "image"); +``` + +.NET Aspire resolved these parameters automatically, allowing templates to deploy without explicit wiring. + +## New behavior + +.NET Aspire no longer pre-populates the deprecated parameters. If a Bicep template declares any of these parameters without explicit assignment, deployment fails with an "undefined parameter" error. Developers must now explicitly model resources and pass their values to templates. + +For example: + +```csharp +var env = builder.AddAzureContainerAppEnvironment("env"); +var kv = builder.AddAzureKeyVault("kv"); +var la = builder.AddAzureLogAnalyticsWorkspace("la"); + +builder.AddBicepTemplateFile("kvTemplate", "keyvault.bicep") + .WithParameter("keyVaultName", kv.NameOutputReference); + +builder.AddBicepTemplateFile("apiTemplate", "api.bicep") + .WithParameter("containerAppEnvironmentName", env.NameOutputReference); +``` + +Inside the Bicep template: + +```bicep +param containerAppEnvironmentName string + +resource env 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + name: containerAppEnvironmentName +} + +var environmentId = env.id +``` + +## Type of breaking change + +This is both a [source incompatible](../categories.md#source-compatibility) and [behavioral](../categories.md#behavioral-change) change. + +## Reason for change + +.NET Aspire now supports modeling multiple compute environments in a single application graph. Automatically injecting global parameters created ambiguity, hid dependencies, and complicated debugging. This change enforces explicit wiring, ensuring predictable behavior and enabling future scenarios where resources target specific environments. + +## Recommended action + +1. **Stop using obsolete constants** + + Remove any code that relies on `AzureBicepResource.KnownParameters.KeyVaultName`, `AzureBicepResource.KnownParameters.LogAnalyticsWorkspaceId`, `containerAppEnvironmentId`, or `containerAppEnvironmentName`. + +1. **Model resources explicitly** + + Define resources like Key Vaults, Log Analytics Workspaces, and Container App Environments explicitly in your code. + + ```csharp + var env = builder.AddAzureContainerAppEnvironment("env"); + var kv = builder.AddAzureKeyVault("kv"); + var la = builder.AddAzureLogAnalyticsWorkspace("la"); + ``` + +1. **Pass parameters explicitly** + + Use strongly-typed properties like `NameOutputReference` to pass resource values to templates. + + ```csharp + builder.AddBicepTemplateFile("template", "file.bicep") + .WithParameter("keyVaultName", kv.NameOutputReference); + ``` + +1. **Address warnings** + + Update code to resolve `[Obsolete]` warnings by replacing deprecated constants with explicit resource definitions. + +## Affected APIs + +- `AzureBicepResource.KnownParameters.KeyVaultName`: Obsolete. +- `AzureBicepResource.KnownParameters.LogAnalyticsWorkspaceId`: Obsolete. diff --git a/docs/compatibility/9.4/azure-storage-apis-renamed.md b/docs/compatibility/9.4/azure-storage-apis-renamed.md new file mode 100644 index 0000000000..fea6365a74 --- /dev/null +++ b/docs/compatibility/9.4/azure-storage-apis-renamed.md @@ -0,0 +1,123 @@ +--- +title: "Breaking change - Azure Storage APIs renamed and refactored" +description: "Learn about the breaking changes in .NET Aspire 9.4 where Azure Storage APIs were renamed and refactored for clarity and consistency." +ms.date: 07/08/2025 +ai-usage: ai-assisted +ms.custom: https://github.com/dotnet/docs-aspire/issues/3930 +--- + +# Azure Storage APIs renamed and refactored + +In .NET Aspire 9.4, several Azure Storage APIs were renamed and refactored for clarity and consistency. These changes affect how you add and configure Azure Blob, Queue, and Table storage resources and clients in your Aspire applications. The new API names better align with Azure resource naming and reduce confusion. + +## Version introduced + +.NET Aspire 9.4 + +## Previous behavior + +Previously, you used methods like `AddBlobs`, `AddBlobContainer`, `AddQueues`, and `AddTables` to add Azure Storage resources. + +**Hosting integration example:** + +```csharp +var builder = DistributedApplication.CreateBuilder(args); + +var storage = builder.AddAzureStorage("storage"); + +var blobs = storage.AddBlobs("blobs"); +var blobContainer = blobs.AddBlobContainer("container"); + +var queues = storage.AddQueues("queues"); +var tables = storage.AddTables("tables"); +``` + +Client registration methods also used names like `AddAzureBlobClient`, `AddAzureQueueClient`, and `AddAzureTableClient`. + +**Client integration example:** + +```csharp +var builder = WebApplication.CreateBuilder(args); + +builder.AddAzureBlobClient("storage"); +builder.AddAzureQueueClient("storage"); +builder.AddAzureTableClient("storage"); +``` + +## New behavior + +Now, the API uses more explicit names that match Azure resource types. For example, use `AddBlobService`, `AddBlobContainer`, `AddQueueService`, `AddQueue`, `AddTableService`, and `AddTable`. + +**Hosting integration example:** + +```csharp +var builder = DistributedApplication.CreateBuilder(args); + +var storage = builder.AddAzureStorage("storage"); + +var blobs = storage.AddBlobService("blobService"); +blobs.AddBlobContainer("container"); + +var queues = storage.AddQueueService("queueService"); +queues.AddQueue("queue"); + +var tables = storage.AddTableService("tableService"); +``` + +Client registration methods now use names like `AddAzureBlobServiceClient`, `AddAzureQueueServiceClient`, and `AddAzureTableServiceClient`. + +**Client integration example:** + +```csharp +var builder = WebApplication.CreateBuilder(args); + +builder.AddAzureBlobServiceClient("storage"); +builder.AddAzureQueueServiceClient("storage"); +builder.AddAzureTableServiceClient("storage"); +``` + +### API changes summary + +The following table summarizes the key hosting integration API changes: + +| Obsolete API | New API | Notes | +|--|--|--| +| `AddBlobs` | `AddBlobService` | — | +| `AddBlobContainer` | `AddBlobContainer` | New API uses `IResourceBuilder` overload. | +| `AddTables` | `AddTableService` | — | +| `AddQueues` | `AddQueueService` | — | +| N/A | `AddQueue` | — | + +The following table summarizes the key client registration API changes: + +| Obsolete API | New API | +|--|--| +| `AddAzureBlobClient` | `AddAzureBlobServiceClient` | +| `AddAzureQueueClient` | `AddAzureQueueServiceClient` | +| `AddAzureTableClient` | `AddAzureTableServiceClient` | + +## Type of breaking change + +This change is a [binary incompatible](../categories.md#binary-compatibility) and [source incompatible](../categories.md#source-compatibility) change. + +## Reason for change + +The new API names provide consistency with Azure client libraries and resource granularity. This reduces confusion and makes it easier to understand and maintain Aspire applications that use Azure Storage resources. For more information, see the [GitHub issue](https://github.com/dotnet/docs-aspire/issues/3930). + +## Recommended action + +1. Update your code to use the new method names for adding and configuring Azure Storage resources and clients. +1. Replace any obsolete method calls with their new equivalents as shown in the examples above. +1. Recompile your application to ensure compatibility with .NET Aspire 9.4. + +## Affected APIs + +- `AddBlobs` +- `AddBlobContainer` +- `AddTables` +- `AddQueues` +- `AddAzureBlobClient` +- `AddAzureQueueClient` +- `AddAzureTableClient` + +For a complete list of changes, see the [pull request](https://github.com/dotnet/aspire/pull/10241). diff --git a/docs/compatibility/9.4/getsecretoutput-deprecated.md b/docs/compatibility/9.4/getsecretoutput-deprecated.md new file mode 100644 index 0000000000..a826f460ec --- /dev/null +++ b/docs/compatibility/9.4/getsecretoutput-deprecated.md @@ -0,0 +1,76 @@ +--- +title: "Breaking change - BicepSecretOutputReference and GetSecretOutput are now obsolete" +description: "Learn about the breaking change in .NET Aspire 9.4 where BicepSecretOutputReference, GetSecretOutput, and related automatic Key Vault logic are deprecated." +ms.date: 07/08/2025 +ai-usage: ai-assisted +ms.custom: https://github.com/dotnet/docs-aspire/issues/3670 +--- + +# BicepSecretOutputReference and GetSecretOutput are now obsolete + +In .NET Aspire 9.4, the `BicepSecretOutputReference` type, the `GetSecretOutput(...)` helper method, and the overload of `WithEnvironment` that accepted a `BicepSecretOutputReference` are now obsolete. Automatic Key Vault generation and secret wiring logic were removed. Projects that relied on these APIs for automatic secret management must migrate to explicit Key Vault resource modeling and secret references. + +## Version introduced + +.NET Aspire 9.4 + +## Previous behavior + +Previously, you could use `GetSecretOutput(...)` to obtain a `BicepSecretOutputReference` from a resource, and pass it to `WithEnvironment`. Aspire would automatically generate a Key Vault and wire up the secret URI for you. + +Example: + +```csharp +var db = builder.AddAzureCosmosDB("mydb").WithAccessKeyAuthentication(); + +builder.AddContainer("api", "image") + .WithEnvironment("ConnStr", db.GetSecretOutput("connectionString")); +``` + +## New behavior + +Now, Aspire no longer creates Key Vaults or secrets automatically. You must explicitly create or reference a Key Vault and use an explicit secret reference. + +Example: + +```csharp +var kv = builder.AddAzureKeyVault("kv"); +builder.AddContainer("api", "image") + .WithEnvironment("ConnStr", kv.GetSecret("connectionString")); +``` + +`GetSecretOutput(...)` is now obsolete and will be removed in a future release. The overload of `WithEnvironment` that accepted a `BicepSecretOutputReference` is also obsolete. + +## Type of breaking change + +This change is a [binary incompatible](../categories.md#binary-compatibility) and [source incompatible](../categories.md#source-compatibility) change. + +## Reason for change + +Implicit Key Vault creation made deployments opaque and fragile. Removing the secret-output shortcut aligns Aspire with its explicit-resource philosophy, giving you full control over secret management and simplifying infrastructure generation. For more information, see the [GitHub issue](https://github.com/dotnet/docs-aspire/issues/3670). + +## Recommended action + +1. Create or reference a Key Vault in your Aspire graph: + + ```csharp + var kv = builder.AddAzureKeyVault("kv"); + ``` + +1. Replace `GetSecretOutput` usage with an explicit secret reference: + + ```csharp + builder.AddContainer("api", "image") + .WithEnvironment("ConnStr", kv.GetSecret("connectionString")); + ``` + +1. Remove obsolete `WithEnvironment(string, BicepSecretOutputReference)` overloads and switch to `WithEnvironment(string, IAzureKeyVaultSecretReference)` (or another appropriate overload). + +Aspire's resources with support for keys were updated to handle this new change. + +## Affected APIs + +- +- +- +- Automatic Key Vault generation and secret wiring logic (removed) diff --git a/docs/compatibility/9.4/index.md b/docs/compatibility/9.4/index.md new file mode 100644 index 0000000000..54dd07473f --- /dev/null +++ b/docs/compatibility/9.4/index.md @@ -0,0 +1,25 @@ +--- +title: Breaking changes in .NET Aspire 9.4 +titleSuffix: "" +description: Navigate to the breaking changes in .NET Aspire 9.4. +ms.date: 07/08/2025 +--- + +# Breaking changes in .NET Aspire 9.4 + +If you're migrating an app to .NET Aspire 9.4, the breaking changes listed here might affect you. + +[!INCLUDE [binary-source-behavioral](../includes/binary-source-behavioral.md)] + +> [!NOTE] +> This article is a work in progress. It's not a complete list of breaking changes in .NET Aspire 9.4. + +## Breaking changes + +| Title | Type of change | Introduced version | +|--|--|--| +| [AddAzureOpenAI defaults to CognitiveServicesOpenAIUser role](add-azure-openai-default-changes.md) | Behavioral change | 9.4 | +| [Azure Storage APIs renamed and refactored](azure-storage-apis-renamed.md) | Binary incompatible, source incompatible | 9.4 | +| [BicepSecretOutputReference and GetSecretOutput are now obsolete](getsecretoutput-deprecated.md) | Binary incompatible, source incompatible | 9.4 | +| [Deprecating various known parameters in AzureBicepResource](azure-bicep-parameters-deprecated.md) | Source incompatible, behavioral change | 9.4 | +| [Local auth is disabled by default on Azure resources](local-auth-disabled-for-azure-resources.md) | Behavioral change | 9.4 | diff --git a/docs/compatibility/9.4/local-auth-disabled-for-azure-resources.md b/docs/compatibility/9.4/local-auth-disabled-for-azure-resources.md new file mode 100644 index 0000000000..deafd3341d --- /dev/null +++ b/docs/compatibility/9.4/local-auth-disabled-for-azure-resources.md @@ -0,0 +1,53 @@ +--- +title: "Breaking change - Local auth is disabled by default on Azure resources" +description: "Learn about the breaking change in Aspire 9.4 where local authentication is disabled by default for certain Azure resources." +ms.date: 7/4/2025 +ai-usage: ai-assisted +ms.custom: https://github.com/dotnet/docs-aspire/issues/3723 +--- + +# Local auth is disabled by default on Azure resources + +Starting in .NET Aspire 9.4, local authentication is disabled by default for Azure EventHubs and Azure WebPubSub integrations. This change improves security by aligning with Azure environments that reject resources with local authentication enabled. + +## Version introduced + +.NET Aspire 9.4 + +## Previous behavior + +Previously, Azure EventHubs and Azure WebPubSub resources were created with local authentication enabled by default (`disableLocalAuth = false`). + +## New behavior + +Now, Azure EventHubs and Azure WebPubSub resources are created with local authentication disabled by default (`disableLocalAuth = true`). + +## Type of breaking change + +This is a [behavioral change](../categories.md#behavioral-change). + +## Reason for change + +Disabling local authentication by default provides a more secure configuration. Some Azure environments reject resources with local authentication enabled, and this change ensures compatibility with those environments. + +## Recommended action + +If you are using the .NET Aspire client integrations for these services, no changes are required, and your application will continue to function as expected. + +If you're using a SAS token or other connection string with an access key, you must either: + +1. Re-enable local authentication using the method. +1. Update your application to use Entra ID authentication. + +### Example: Re-enabling local authentication + +1. In the corresponding Azure resource, chain a call to `ConfigureInfrastructure`. +1. Get the instance of the provisioning resource type in question, for example: + + - Azure Event Hubs: . For more information on configuring infra, see [Customize provisioning infrastructure](../../messaging/azure-event-hubs-integration.md#customize-provisioning-infrastructure). + - Azure Web PubSub: . For more information on configuring infra, see [Customize provisioning infrastructure](../../messaging/azure-web-pubsub-integration.md#customize-provisioning-infrastructure). + +## Affected APIs + +- `AddAzureEventHubs` +- `AddAzureWebPubSub` diff --git a/docs/compatibility/toc.yml b/docs/compatibility/toc.yml index 1dc0ede560..9dc725f8a4 100644 --- a/docs/compatibility/toc.yml +++ b/docs/compatibility/toc.yml @@ -5,6 +5,24 @@ items: href: ../get-started/aspire-overview.md - name: Breaking changes href: breaking-changes.md +- name: .NET Aspire 9.4 + expanded: true + items: + - name: Overview + href: 9.4/index.md + - name: Breaking changes in 9.4 + expanded: true + items: + - name: AddAzureOpenAI defaults to CognitiveServicesOpenAIUser role + href: 9.4/add-azure-openai-default-changes.md + - name: Azure Storage APIs renamed and refactored + href: 9.4/azure-storage-apis-renamed.md + - name: BicepSecretOutputReference and GetSecretOutput are now obsolete + href: 9.4/getsecretoutput-deprecated.md + - name: Deprecating various known parameters in AzureBicepResource + href: 9.4/azure-bicep-parameters-deprecated.md + - name: Local auth disabled by default on Azure resources + href: 9.4/local-auth-disabled-for-azure-resources.md - name: .NET Aspire 9.3 expanded: true items: diff --git a/docs/fundamentals/networking-overview.md b/docs/fundamentals/networking-overview.md index 8e9e579c82..b83cd8e138 100644 --- a/docs/fundamentals/networking-overview.md +++ b/docs/fundamentals/networking-overview.md @@ -1,7 +1,7 @@ --- title: .NET Aspire inner loop networking overview description: Learn how .NET Aspire handles networking and endpoints, and how you can use them in your app code. -ms.date: 10/29/2024 +ms.date: 07/11/2025 ms.topic: overview --- @@ -30,6 +30,29 @@ To help visualize how endpoints work, consider the .NET Aspire starter templates :::image type="content" source="media/networking/networking-proxies-1x.png" lightbox="media/networking/networking-proxies.png" alt-text=".NET Aspire Starter Application template inner loop networking diagram."::: +## How container networks are managed + +When you add one or more container resources, .NET Aspire creates a dedicated container bridge network to enable service discovery between containers. This bridge network is a virtual network that lets containers communicate with each other and provides a DNS server for container-to-container service discovery using DNS names. + +The network's lifetime depends on the container resources: + +- If all containers have a session lifetime, the network is also session-based and is cleaned up when the app host process ends. +- If any container has a persistent lifetime, the network is persistent and remains running after the app host process terminates. Aspire reuses this network on subsequent runs, allowing persistent containers to keep communicating even when the app host isn't running. + +For more information on container lifetimes, see [Container resource lifetime](orchestrate-resources.md#container-resource-lifetime). + +Here are the naming conventions for container networks: + +- **Session networks**: `aspire-session-network--` +- **Persistent networks**: `aspire-persistent-network--` + +Each app host instance gets its own network resources. The only differences are the network's lifetime and name; service discovery works the same way for both. + +Containers register themselves on the network using their resource name. Aspire uses this name for service discovery between containers. For example, a `pgadmin` container can connect to a database resource named `postgres` using `postgres:5432`. + +> [!NOTE] +> Host services, such as projects or other executables, don't use container networks. They rely on exposed container ports for service discovery and communication with containers. For more details on service discovery, see [service discovery overview](../service-discovery/overview.md). + ## Launch profiles When you call , the app host looks for _Properties/launchSettings.json_ to determine the default set of endpoints. The app host selects a specific launch profile using the following rules: diff --git a/docs/fundamentals/setup-tooling.md b/docs/fundamentals/setup-tooling.md index a4fb2e10ef..7a722dbe0c 100644 --- a/docs/fundamentals/setup-tooling.md +++ b/docs/fundamentals/setup-tooling.md @@ -1,7 +1,7 @@ --- title: .NET Aspire tooling description: Learn about essential tooling concepts for .NET Aspire. -ms.date: 05/30/2025 +ms.date: 07/11/2025 zone_pivot_groups: dev-environment uid: dotnet/aspire/setup-tooling --- @@ -22,6 +22,7 @@ uid: dotnet/aspire/setup-tooling To work with .NET Aspire, you need the following installed locally: - [.NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0) or [.NET 9.0](https://dotnet.microsoft.com/download/dotnet/9.0). + - Starting with .NET Aspire 9.4, [.NET 10 Preview 5 or later](https://dotnet.microsoft.com/download/dotnet/10.0) is supported. - An OCI compliant container runtime, such as: - [Docker Desktop](https://www.docker.com/products/docker-desktop) - [Podman](https://podman.io/) diff --git a/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Program.cs b/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AppHost.cs similarity index 100% rename from docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Program.cs rename to docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AppHost.cs diff --git a/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj b/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj index e8fb36acd8..e87ee2447f 100644 --- a/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj +++ b/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj @@ -8,6 +8,6 @@ d1fafd31-bb63-479d-bc2b-a4067786068f - + \ No newline at end of file diff --git a/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Console.txt b/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Console.txt index 8e36e37c71..e0cb244a01 100644 --- a/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Console.txt +++ b/docs/fundamentals/snippets/lifecycles/AspireApp/AspireApp.AppHost/Console.txt @@ -1,7 +1,7 @@ info: LifecycleLogger[0] 1. BeforeStartAsync info: Aspire.Hosting.DistributedApplication[0] - Aspire version: 9.3.0 + Aspire version: 9.4.0 info: Aspire.Hosting.DistributedApplication[0] Distributed application starting. info: Aspire.Hosting.DistributedApplication[0] diff --git a/docs/includes/aspire-prereqs.md b/docs/includes/aspire-prereqs.md index 3e9b4703da..9b125a9bbe 100644 --- a/docs/includes/aspire-prereqs.md +++ b/docs/includes/aspire-prereqs.md @@ -2,7 +2,8 @@ To work with .NET Aspire, you need the following installed locally: -- [.NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0) or [.NET 9.0](https://dotnet.microsoft.com/download/dotnet/9.0) +- [.NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0) or [.NET 9.0](https://dotnet.microsoft.com/download/dotnet/9.0). + - Starting with .NET Aspire 9.4, [.NET 10 Preview 5 or later](https://dotnet.microsoft.com/download/dotnet/10.0) is supported. - An OCI compliant container runtime, such as: - [Docker Desktop](https://www.docker.com/products/docker-desktop) or [Podman](https://podman.io/). For more information, see [Container runtime](../fundamentals/setup-tooling.md#container-runtime). - An Integrated Developer Environment (IDE) or code editor, such as: diff --git a/docs/toc.yml b/docs/toc.yml index ce9c3d7145..a6912b9fc2 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -31,8 +31,8 @@ items: href: get-started/github-codespaces.md - name: Dev Containers href: get-started/dev-containers.md - - name: What's new in .NET Aspire 9.3 - href: whats-new/dotnet-aspire-9.3.md + - name: What's new in .NET Aspire 9.4 + href: whats-new/dotnet-aspire-9.4.md - name: Upgrade to .NET Aspire 9.0 href: get-started/upgrade-to-aspire-9.md diff --git a/docs/whats-new/dotnet-aspire-9.4.md b/docs/whats-new/dotnet-aspire-9.4.md new file mode 100644 index 0000000000..3ae6056d14 --- /dev/null +++ b/docs/whats-new/dotnet-aspire-9.4.md @@ -0,0 +1,354 @@ +--- +title: What's new in .NET Aspire 9.4 +description: Learn what's new in the official general availability release of .NET Aspire 9.4. +ms.date: 07/03/2025 +--- + +# What's new in .NET Aspire 9.4 + +_Aspire 9.4 introduces improvements across the CLI, dashboard, deployment, and provisioning experiences — all designed to streamline developer workflows and reduce friction._ + +## CLI and Dashboard + +This release introduces major enhancements to interactivity and diagnostics in the CLI and Dashboard. From validated user prompts to better logging visibility, Aspire now helps you catch configuration errors faster, streamline your local dev loop, and navigate logs more effectively. + +- **Add logs to trace details** ([#10281](https://github.com/dotnet/aspire/pull/10281)) +- **chore: aspire exec report error when executable failed to start** ([#10277](https://github.com/dotnet/aspire/pull/10277)) +- **Fix race error in text visualizer** ([#10273](https://github.com/dotnet/aspire/pull/10273)) +- **Add dashboard telemetry to interaction service** ([#10272](https://github.com/dotnet/aspire/pull/10272)) +- **Move IInteractionService and related types to Aspire.Hosting namespace** ([#10267](https://github.com/dotnet/aspire/pull/10267)) +- **Don't throw in interaction service when no inputs** ([#10257](https://github.com/dotnet/aspire/pull/10257)) +- **send basic telemetry (command invocation)** ([#10246](https://github.com/dotnet/aspire/pull/10246)) +- **feat: aspire exec 2** ([#10240](https://github.com/dotnet/aspire/pull/10240)) +- **Added support for prompting for parameter values in run mode** ([#10235](https://github.com/dotnet/aspire/pull/10235)) +- **Revert "feat: aspire exec (#10061)"** ([#10227](https://github.com/dotnet/aspire/pull/10227)) +- **Move InteractionResult to right file** ([#10226](https://github.com/dotnet/aspire/pull/10226)) +- **Add support for interaction input validation to CLI** ([#10194](https://github.com/dotnet/aspire/pull/10194)) +- **Add support for markdown formatting in interaction message** ([#10189](https://github.com/dotnet/aspire/pull/10189)) +- **Add check to not show an empty message in extension interaction service** ([#10188](https://github.com/dotnet/aspire/pull/10188)) +- **Fix Debug.Assert with side effects in ExtensionInteractionService** ([#10172](https://github.com/dotnet/aspire/pull/10172)) +- **Fix promptText formatting in selection output** ([#10148](https://github.com/dotnet/aspire/pull/10148)) +- **Remove HTML escaping option from interaction service** ([#10135](https://github.com/dotnet/aspire/pull/10135)) +- **Improve telemetry logging** ([#10133](https://github.com/dotnet/aspire/pull/10133)) +- **Fix space between header and content in trace detail** ([#10132](https://github.com/dotnet/aspire/pull/10132)) +- **Interaction service improvements** ([#10131](https://github.com/dotnet/aspire/pull/10131)) +- **Add Value property to PublishingPromptInput to enable default value flow** ([#10111](https://github.com/dotnet/aspire/pull/10111)) +- **Implement CLI prompting on top of InteractionService** ([#10101](https://github.com/dotnet/aspire/pull/10101)) +- **Telemetry fixes** ([#10080](https://github.com/dotnet/aspire/pull/10080)) +- **feat: aspire exec** ([#10061](https://github.com/dotnet/aspire/pull/10061)) +- **Rename interaction inputs, improve input dialog UX** ([#10056](https://github.com/dotnet/aspire/pull/10056)) +- **Reenable extensions interaction service** ([#10047](https://github.com/dotnet/aspire/pull/10047)) +- **Quick fix to codespaces dashboard link.** ([#10033](https://github.com/dotnet/aspire/pull/10033)) +- **Increase name column width on the trace detail page** ([#10032](https://github.com/dotnet/aspire/pull/10032)) +- **Revert "Initial extension interaction service (#9927)"** ([#10030](https://github.com/dotnet/aspire/pull/10030)) +- **Handle interaction service unimplemented and tests** ([#10014](https://github.com/dotnet/aspire/pull/10014)) +- **Add interaction validation** ([#9989](https://github.com/dotnet/aspire/pull/9989)) +- **More interaction service** ([#9986](https://github.com/dotnet/aspire/pull/9986)) +- **Interaction service** ([#9943](https://github.com/dotnet/aspire/pull/9943)) +- **Initial extension interaction service** ([#9927](https://github.com/dotnet/aspire/pull/9927)) +- **Fix dashboard URL display in Aspire CLI after localization changes.** ([#9909](https://github.com/dotnet/aspire/pull/9909)) +- **rename InteractionService to ConsoleInteractionService** ([#9908](https://github.com/dotnet/aspire/pull/9908)) +- **Use default colors for prompts in CLI.** ([#9810](https://github.com/dotnet/aspire/pull/9810)) +- **Style dashboard blazor reconnect modal** ([#9809](https://github.com/dotnet/aspire/pull/9809)) +- **Fix dashboard selecting resources with dashes in instance ids** ([#9759](https://github.com/dotnet/aspire/pull/9759)) +- **Add .NET 10 support to dashboard** ([#9733](https://github.com/dotnet/aspire/pull/9733)) +- **Fix two common dashboard errors** ([#9699](https://github.com/dotnet/aspire/pull/9699)) +- **[CI] Fail tests validation run if vscode extensions tests fail** ([#9691](https://github.com/dotnet/aspire/pull/9691)) +- **Add additional interaction service tests, clean up** ([#9679](https://github.com/dotnet/aspire/pull/9679)) +- **Quarantine Aspire.Cli.Tests.Projects.ProjectLocatorTests.UseOrFindAppHostProjectFilePromptsWhenMultipleFilesFound** ([#9669](https://github.com/dotnet/aspire/pull/9669)) +- **[release/9.3] Initialize telemetry context in UpdateTelemetryProperties if not already initialized** ([#9602](https://github.com/dotnet/aspire/pull/9602)) +- **Add WithDashboard() method to allow opting out of Aspire dashboard in Azure Container App environments** ([#9600](https://github.com/dotnet/aspire/pull/9600)) +- **Add dashboard resource to AddDockerComposeEnvironment** ([#9597](https://github.com/dotnet/aspire/pull/9597)) +- **Prompting for additional template args.** ([#9558](https://github.com/dotnet/aspire/pull/9558)) +- **Initialize telemetry context in UpdateTelemetryProperties if not already initialized** ([#9553](https://github.com/dotnet/aspire/pull/9553)) +- **Add SupportsDetailedTelemetry to protocol and opt resources using Microsoft Open public key into it** ([#9531](https://github.com/dotnet/aspire/pull/9531)) +- **Show/hide hidden resources on dashboard** ([#9180](https://github.com/dotnet/aspire/pull/9180)) + +## Publishing and Deployment + +The publishing experience is now more robust and user-friendly, with improvements in progress tracking, step/task modeling, and parameter handling. These changes help clarify what's happening during publish or deploy and make it easier to customize your flows. + +- **Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2746004** ([#10264](https://github.com/dotnet/aspire/pull/10264)) +- **Option to persist parameters to secrets** ([#10260](https://github.com/dotnet/aspire/pull/10260)) +- **Rename IPublishingActivityProgressReporter to IPublishingActivityReporter** ([#10253](https://github.com/dotnet/aspire/pull/10253)) +- **Remove warning on publish of external service with parameterized URL** ([#10222](https://github.com/dotnet/aspire/pull/10222)) +- **Remove deployCommandEnabled feature flag from Aspire CLI** ([#10155](https://github.com/dotnet/aspire/pull/10155)) +- **Rename and refactor steps/tasks-related publishing APIs** ([#10145](https://github.com/dotnet/aspire/pull/10145)) +- **Add console output after choice selection in publish command** ([#10120](https://github.com/dotnet/aspire/pull/10120)) +- **Fix usability issues with IPublishingActivityProgressReporter** ([#10108](https://github.com/dotnet/aspire/pull/10108)) +- **Fix failing `PublishAsAzureContainerApp_ThrowsIfNoEnvironment` test** ([#10104](https://github.com/dotnet/aspire/pull/10104)) +- **Parameter Improvements** ([#10094](https://github.com/dotnet/aspire/pull/10094)) +- **Fix output when publish completes with warning** ([#10077](https://github.com/dotnet/aspire/pull/10077)) +- **Add ContainerBuildOptions support to ResourceContainerImageBuilder for customizing dotnet publish** ([#10074](https://github.com/dotnet/aspire/pull/10074)) +- **Add ProgressReporter property to DeployingContext** ([#10067](https://github.com/dotnet/aspire/pull/10067)) +- **Fix AzurePublishingContext to ignore resources with ManifestPublishingCallbackAnnotation.Ignore** ([#10064](https://github.com/dotnet/aspire/pull/10064)) +- **Enable PublishAot where available** ([#10053](https://github.com/dotnet/aspire/pull/10053)) +- **Refactor publishing state model and CLI protocol to aggregate CompletionState at all levels** ([#10037](https://github.com/dotnet/aspire/pull/10037)) +- **Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2737112** ([#10028](https://github.com/dotnet/aspire/pull/10028)) +- **Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2736020** ([#10006](https://github.com/dotnet/aspire/pull/10006)) +- **Add extension methods to PublishingStep & PublishingTask for direct Complete/Update operations** ([#9995](https://github.com/dotnet/aspire/pull/9995)) +- **Improve the publish/deploy output** ([#9981](https://github.com/dotnet/aspire/pull/9981)) +- **Add isError parameter to CompleteStepAsync method in PublishingActivityProgressReporter** ([#9979](https://github.com/dotnet/aspire/pull/9979)) +- **Update PublishingActivityProgressReporter to support step/task views** ([#9971](https://github.com/dotnet/aspire/pull/9971)) +- **Inject DOTNET_CLI_USE_MSBUILD_SERVER env var for apphost builds and runs, using configuration for value** ([#9946](https://github.com/dotnet/aspire/pull/9946)) +- **Emit Int32OrStringV1 as int from Kubernetes publisher.** ([#9933](https://github.com/dotnet/aspire/pull/9933)) +- **Fix Kubernetes publisher Kubernetes and Helm resource names** ([#9898](https://github.com/dotnet/aspire/pull/9898)) +- **Quarantine flaky test PublishCommandSucceedsEndToEnd** ([#9872](https://github.com/dotnet/aspire/pull/9872)) +- **Fail on publish/deploy if nothing happened.** ([#9850](https://github.com/dotnet/aspire/pull/9850)) +- **Add Kubernetes publisher Workload and Resource extension points** ([#9819](https://github.com/dotnet/aspire/pull/9819)) +- **Add support for DeployCommand and DeployingCallbackAnnotation** ([#9792](https://github.com/dotnet/aspire/pull/9792)) +- **Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2727100** ([#9761](https://github.com/dotnet/aspire/pull/9761)) +- **Fix Azure Container Apps deployment failure with uppercase resource names** ([#9752](https://github.com/dotnet/aspire/pull/9752)) +- **Add generic WithEnvironment overload for IValueProvider and IManifestExpressionProvider** ([#9748](https://github.com/dotnet/aspire/pull/9748)) +- **[CI] Publish binaries for Aspire.Cli** ([#9695](https://github.com/dotnet/aspire/pull/9695)) +- **Add support for existing Log Analytics Workspace when publishing into a Container App Environment** ([#9624](https://github.com/dotnet/aspire/pull/9624)) +- **Externalize unknown parameters in ContainerApps and AppServiceWebSite** ([#9619](https://github.com/dotnet/aspire/pull/9619)) +- **Remove a few auto injected known parameters** ([#9590](https://github.com/dotnet/aspire/pull/9590)) +- **[release/9.3] Use ProcessSpec for invoking dotnet publish** ([#9561](https://github.com/dotnet/aspire/pull/9561)) +- **Update the WithInitFiles implementations to use bind mounts in publish mode** ([#9528](https://github.com/dotnet/aspire/pull/9528)) +- **Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2719391** ([#9469](https://github.com/dotnet/aspire/pull/9469)) + +## Provisioning and Deployment + +Aspire 9.4 expands support for Azure provisioning, including enhancements to Azure AI, OpenAI, SQL, and custom scripts. These updates make it easier to configure secure cloud resources with appropriate defaults and role assignments, streamlining both local development and production rollouts. + +- **[release/9.4] Refactor Azure Storage API** ([#10303](https://github.com/dotnet/aspire/pull/10303)) +- **Change Azure OpenAI to use CognitiveServicesOpenAIUser role by default** ([#10293](https://github.com/dotnet/aspire/pull/10293)) +- **Add role support to Azure AI Foundry** ([#10292](https://github.com/dotnet/aspire/pull/10292)) +- **Update AzureSqlServerResource to use the new AzurePowerShellScript provisioning feature** ([#10290](https://github.com/dotnet/aspire/pull/10290)) +- **Refactor Azure Storage API** ([#10241](https://github.com/dotnet/aspire/pull/10241)) +- **Refactor Endpoint bicep references in AI Foundry resource** ([#10193](https://github.com/dotnet/aspire/pull/10193)) +- **Kubernetes Publisher connection strings fix** ([#10091](https://github.com/dotnet/aspire/pull/10091)) +- **Add Azure AI Foundry support** ([#9974](https://github.com/dotnet/aspire/pull/9974)) +- **[release/9.3] Fix SqlServer PowerShell module version to avoid breaking changes in 22.4.5.1** ([#9958](https://github.com/dotnet/aspire/pull/9958)) +- **Fix SqlServer PowerShell module version to avoid breaking changes in 22.4.5.1** ([#9939](https://github.com/dotnet/aspire/pull/9939)) +- **Add connection string to resource details** ([#9882](https://github.com/dotnet/aspire/pull/9882)) +- **Use custom ConnectionStringBuilder when mutating connection strings** ([#9839](https://github.com/dotnet/aspire/pull/9839)) +- **[release/9.3] Force SqlDatabase resource api version** ([#9535](https://github.com/dotnet/aspire/pull/9535)) +- **Force SqlDatabase resource api version** ([#9530](https://github.com/dotnet/aspire/pull/9530)) +- **[release/9.3] Fix Blob Container Connection String Format Exception** ([#9496](https://github.com/dotnet/aspire/pull/9496)) + +## Other improvements + +We've also made a variety of under-the-hood improvements to increase test reliability, enhance telemetry, and reduce visual clutter. These changes keep Aspire fast, clean, and ready for production workflows. + +- **Branding updates for 9.5.0** ([#10302](https://github.com/dotnet/aspire/pull/10302)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#10291](https://github.com/dotnet/aspire/pull/10291)) +- **Add missing end quote for Outputs declaration** ([#10289](https://github.com/dotnet/aspire/pull/10289)) +- **bump the version of azure.provisioning** ([#10284](https://github.com/dotnet/aspire/pull/10284)) +- **Use different names for persistent and session scoped networks** ([#10278](https://github.com/dotnet/aspire/pull/10278)) +- **Add option to console logs to wrap log lines** ([#10271](https://github.com/dotnet/aspire/pull/10271)) +- **Fix thread safety issue in Razor view** ([#10270](https://github.com/dotnet/aspire/pull/10270)) +- **Fix typo in `TalkingClockResource` comment** ([#10269](https://github.com/dotnet/aspire/pull/10269)) +- **Use log output channel and remove abstraction** ([#10256](https://github.com/dotnet/aspire/pull/10256)) +- **Add VS Code instructions to contributing gudelines** ([#10250](https://github.com/dotnet/aspire/pull/10250)) +- **YARP: do not defer configuration generation when using env variable** ([#10242](https://github.com/dotnet/aspire/pull/10242)) +- **Subscribe to this specific resource, not all.** ([#10238](https://github.com/dotnet/aspire/pull/10238)) +- **Replace french_fries emoji with check_mark in CLI template output** ([#10237](https://github.com/dotnet/aspire/pull/10237)) +- **Decrease message bar button text size** ([#10234](https://github.com/dotnet/aspire/pull/10234)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#10230](https://github.com/dotnet/aspire/pull/10230)) +- **Fix ready event subscription for Foundry resource** ([#10229](https://github.com/dotnet/aspire/pull/10229)) +- **Suppress CS9881 in generated project/apphost metadata types** ([#10223](https://github.com/dotnet/aspire/pull/10223)) +- **Fix starvs.cmd script** ([#10219](https://github.com/dotnet/aspire/pull/10219)) +- **Installs aspire extension on codespaces automatically** ([#10217](https://github.com/dotnet/aspire/pull/10217)) +- **[main] Update dependencies from dotnet/arcade** ([#10216](https://github.com/dotnet/aspire/pull/10216)) +- **update extension readme, add contributing.md** ([#10215](https://github.com/dotnet/aspire/pull/10215)) +- **[Automated] Update Playground Manifests** ([#10214](https://github.com/dotnet/aspire/pull/10214)) +- **Configure YARP with environment variables** ([#10210](https://github.com/dotnet/aspire/pull/10210)) +- **Add user-friendly message when AddCommand search returns no results** ([#10209](https://github.com/dotnet/aspire/pull/10209)) +- **Refine aspire CLI run command grid display with right-aligned labels and padding** ([#10207](https://github.com/dotnet/aspire/pull/10207)) +- **Update package.json, add extension logo and license** ([#10190](https://github.com/dotnet/aspire/pull/10190)) +- **Clear status after error** ([#10187](https://github.com/dotnet/aspire/pull/10187)) +- **Code clean up in VersionFetcher** ([#10180](https://github.com/dotnet/aspire/pull/10180)) +- **Fix Foundry Local setup link** ([#10179](https://github.com/dotnet/aspire/pull/10179)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#10178](https://github.com/dotnet/aspire/pull/10178)) +- **Ignore NU1510 warnings** ([#10176](https://github.com/dotnet/aspire/pull/10176)) +- **Update Event Subscriptions in tests to use new `OnXYZ` methods** ([#10171](https://github.com/dotnet/aspire/pull/10171)) +- **Add package ID filtering to VersionFetcher.GetLatestVersion for robustness** ([#10166](https://github.com/dotnet/aspire/pull/10166)) +- **Fix logic for filtering packages coming back from GetPackagesAsync.** ([#10164](https://github.com/dotnet/aspire/pull/10164)) +- **Fix dependabot alert by bumping version of braces resolved by yarn** ([#10153](https://github.com/dotnet/aspire/pull/10153)) +- **Add NameOutputReference and AddAsExistingResource to AzureAppServiceEnvironmentResource** ([#10152](https://github.com/dotnet/aspire/pull/10152)) +- **Drop "sample" from aspire new description** ([#10143](https://github.com/dotnet/aspire/pull/10143)) +- **Fix console logs pause/resume flaky test** ([#10134](https://github.com/dotnet/aspire/pull/10134)) +- **Fix Typos in TalkingClockResource** ([#10117](https://github.com/dotnet/aspire/pull/10117)) +- **Update devcontainer to use .NET 10.0 preview image** ([#10115](https://github.com/dotnet/aspire/pull/10115)) +- **Throw on no input in ExtensionBackchannel** ([#10114](https://github.com/dotnet/aspire/pull/10114)) +- **Reapply "Update dependencies from microsoft/usvc-apiserver** ([#10112](https://github.com/dotnet/aspire/pull/10112)) +- **Revert "Update dependencies from microsoft/usvc-apiserver** ([#10110](https://github.com/dotnet/aspire/pull/10110)) +- **[main] Update dependencies from dotnet/arcade** ([#10100](https://github.com/dotnet/aspire/pull/10100)) +- **Add `IResourceBuilder` extension method for event subscriptions** ([#10097](https://github.com/dotnet/aspire/pull/10097)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#10096](https://github.com/dotnet/aspire/pull/10096)) +- **Fix tests failing on Azdo** ([#10095](https://github.com/dotnet/aspire/pull/10095)) +- **Migrate to slnx, but also add missing project references** ([#10092](https://github.com/dotnet/aspire/pull/10092)) +- **Quarantine flaky test StartResourceForcesStart** ([#10089](https://github.com/dotnet/aspire/pull/10089)) +- **Cleanup error handling conditions for compute environments** ([#10078](https://github.com/dotnet/aspire/pull/10078)) +- **Update to .NET 10 SDK and Arcade 10** ([#10075](https://github.com/dotnet/aspire/pull/10075)) +- **Yarp: defer configuration generation** ([#10072](https://github.com/dotnet/aspire/pull/10072)) +- **Redirect cli logger output to output channel and improve extension logging. Recreate terminal on first command run & then reuse** ([#10071](https://github.com/dotnet/aspire/pull/10071)) +- **[Automated] Update Playground Manifests** ([#10070](https://github.com/dotnet/aspire/pull/10070)) +- **Fix `YarpCluster` construction and add constructor that takes `IResourceWithServiceDiscovery`** ([#10060](https://github.com/dotnet/aspire/pull/10060)) +- **Fix DevcontainerSettingsWriter directory creation in clean codespace environments** ([#10059](https://github.com/dotnet/aspire/pull/10059)) +- **Dedupe shared backchannel types** ([#10058](https://github.com/dotnet/aspire/pull/10058)) +- **[main] Update dependencies from dotnet/arcade** ([#10055](https://github.com/dotnet/aspire/pull/10055)) +- **More extension cleanup** ([#10054](https://github.com/dotnet/aspire/pull/10054)) +- **Only ask for distinct package names in aspire add** ([#10052](https://github.com/dotnet/aspire/pull/10052)) +- **[CI] Reduce Outerloop tests workflow to run once every 6 hours, instead of every 2** ([#10044](https://github.com/dotnet/aspire/pull/10044)) +- **bump provisioning libraries to latest versions** ([#10042](https://github.com/dotnet/aspire/pull/10042)) +- **Add new YARP fluent configuration** ([#10040](https://github.com/dotnet/aspire/pull/10040)) +- **Add dot notation support for aspire config commands** ([#10035](https://github.com/dotnet/aspire/pull/10035)) +- **Add Aspire upgrade check** ([#10034](https://github.com/dotnet/aspire/pull/10034)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#10031](https://github.com/dotnet/aspire/pull/10031)) +- **Update manifest-spec.md** ([#10025](https://github.com/dotnet/aspire/pull/10025)) +- **[main] Update dependencies from dotnet/arcade** ([#10021](https://github.com/dotnet/aspire/pull/10021)) +- **Improve console logs error handling** ([#10012](https://github.com/dotnet/aspire/pull/10012)) +- **Fix TFM/Aspire version selection in templates** ([#10009](https://github.com/dotnet/aspire/pull/10009)) +- **Increase BrowserTokenAuthenticationTests timeouts** ([#10007](https://github.com/dotnet/aspire/pull/10007)) +- **Exclude FluentUI from update dependencies** ([#9998](https://github.com/dotnet/aspire/pull/9998)) +- **Use a digit in resx string which is passed to string.Format** ([#9996](https://github.com/dotnet/aspire/pull/9996)) +- **Use STJ source generation in Cli backchannel** ([#9993](https://github.com/dotnet/aspire/pull/9993)) +- **Add CLI version update notifications to Aspire CLI** ([#9992](https://github.com/dotnet/aspire/pull/9992)) +- **Stream apphost logs across backchannel.** ([#9990](https://github.com/dotnet/aspire/pull/9990)) +- **Clean up extension** ([#9988](https://github.com/dotnet/aspire/pull/9988)) +- **Revert to FluentUI 4.11.9 again** ([#9987](https://github.com/dotnet/aspire/pull/9987)) +- **Fix support for non-localhost endpoint targets** ([#9977](https://github.com/dotnet/aspire/pull/9977)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9975](https://github.com/dotnet/aspire/pull/9975)) +- **Add .http file to ApiService in starter template** ([#9973](https://github.com/dotnet/aspire/pull/9973)) +- **Bump System.CommandLine.** ([#9968](https://github.com/dotnet/aspire/pull/9968)) +- **Add ExternalServiceResource for modeling external services with service discovery support** ([#9965](https://github.com/dotnet/aspire/pull/9965)) +- **Bumping patch version for 9.3.2** ([#9963](https://github.com/dotnet/aspire/pull/9963)) +- **Update .NET dependencies** ([#9962](https://github.com/dotnet/aspire/pull/9962)) +- **Reorder & don't remember Aspire version in IDE's** ([#9961](https://github.com/dotnet/aspire/pull/9961)) +- **Update launchSettings.json to support manifest generation** ([#9959](https://github.com/dotnet/aspire/pull/9959)) +- **Refactor settings file path handling** ([#9951](https://github.com/dotnet/aspire/pull/9951)) +- **bump the version of azure.provisioning.operationalinsights** ([#9947](https://github.com/dotnet/aspire/pull/9947)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9944](https://github.com/dotnet/aspire/pull/9944)) +- **[build] Fix versions of arcade dependencies** ([#9941](https://github.com/dotnet/aspire/pull/9941)) +- **Fix glob pattern so it includes tests/Directory.Packages.props in update-dependencies workflow** ([#9940](https://github.com/dotnet/aspire/pull/9940)) +- **[Automated] Update Playground Manifests** ([#9936](https://github.com/dotnet/aspire/pull/9936)) +- **Add k8s tooling.** ([#9925](https://github.com/dotnet/aspire/pull/9925)) +- **Add a section on requirements for building the repo on Alpine Linux** ([#9924](https://github.com/dotnet/aspire/pull/9924)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9923](https://github.com/dotnet/aspire/pull/9923)) +- **Main** ([#9920](https://github.com/dotnet/aspire/pull/9920)) +- **Quarantine flaky test TracingEnablesTheRightActivitySource_Keyed** ([#9918](https://github.com/dotnet/aspire/pull/9918)) +- **bump versions of azure.provisioning libraries** ([#9915](https://github.com/dotnet/aspire/pull/9915)) +- **Fix console logs clear not going back to a blank state** ([#9910](https://github.com/dotnet/aspire/pull/9910)) +- **clean up rpc server connection logic, update string** ([#9907](https://github.com/dotnet/aspire/pull/9907)) +- **Fix Outerloop Tests workflow failing on forks** ([#9903](https://github.com/dotnet/aspire/pull/9903)) +- **Add linux-musl-amd64 (Alpine linux) specific build support** ([#9901](https://github.com/dotnet/aspire/pull/9901)) +- **Update MTP to 1.7.2** ([#9895](https://github.com/dotnet/aspire/pull/9895)) +- **Update xunit.v3 to 3.0.0-pre.25** ([#9894](https://github.com/dotnet/aspire/pull/9894)) +- **Disable local auth on Azure SignalR** ([#9891](https://github.com/dotnet/aspire/pull/9891)) +- **Template updates for Aspire 9.4 and .NET 10** ([#9883](https://github.com/dotnet/aspire/pull/9883)) +- **Update xunit.v3 to 2.0.3** ([#9876](https://github.com/dotnet/aspire/pull/9876)) +- **Improve compatibility error message to include Aspire.Hosting package version** ([#9875](https://github.com/dotnet/aspire/pull/9875)) +- **Revert "update fluentui packages (#9794)"** ([#9873](https://github.com/dotnet/aspire/pull/9873)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9864](https://github.com/dotnet/aspire/pull/9864)) +- **Consolidate Aspire CLI config subcommands into single command with verb argument** ([#9849](https://github.com/dotnet/aspire/pull/9849)) +- **Use single ActivitySource across CLI components** ([#9848](https://github.com/dotnet/aspire/pull/9848)) +- **Start the beginning of AOT'ing the Aspire.Cli.** ([#9841](https://github.com/dotnet/aspire/pull/9841)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9840](https://github.com/dotnet/aspire/pull/9840)) +- **Cleanup error handling conditions for ACA compute environment** ([#9838](https://github.com/dotnet/aspire/pull/9838)) +- **Quarantine flaky ResourceCommandServiceTests** ([#9836](https://github.com/dotnet/aspire/pull/9836)) +- **[Automated] Update Playground Manifests** ([#9830](https://github.com/dotnet/aspire/pull/9830)) +- **Enhance AppHostExitsWhenCliProcessPidDies test diagnostics and add quarantined test filtering documentation** ([#9816](https://github.com/dotnet/aspire/pull/9816)) +- **Fix user secrets duplication issue by normalizing to flat configuration format** ([#9815](https://github.com/dotnet/aspire/pull/9815)) +- **Fix CLI to automatically fallback when apphost file in settings doesn't exist** ([#9814](https://github.com/dotnet/aspire/pull/9814)) +- **Quarantine flaky test WithHttpCommand_EnablesCommandUsingCustomUpdateStateCallback** ([#9813](https://github.com/dotnet/aspire/pull/9813)) +- **Menu button concurrency fix** ([#9806](https://github.com/dotnet/aspire/pull/9806)) +- **Add ResourceCommandService** ([#9805](https://github.com/dotnet/aspire/pull/9805)) +- **Quarantine flaky test WithHttpCommand_UsesNamedHttpClient** ([#9802](https://github.com/dotnet/aspire/pull/9802)) +- **Disable local auth on Azure EventHubs and WebPubSub** ([#9799](https://github.com/dotnet/aspire/pull/9799)) +- **Update fluentui packages** ([#9794](https://github.com/dotnet/aspire/pull/9794)) +- **Rename unset so that it gets re-translated** ([#9793](https://github.com/dotnet/aspire/pull/9793)) +- **Quarantine flaky test WithHttpCommand_CallsPrepareRequestCallback_BeforeSendingRequest** ([#9791](https://github.com/dotnet/aspire/pull/9791)) +- **[Automated] Update Playground Manifests** ([#9788](https://github.com/dotnet/aspire/pull/9788)) +- **Fix ACA DataProtection** ([#9786](https://github.com/dotnet/aspire/pull/9786)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9780](https://github.com/dotnet/aspire/pull/9780)) +- **Set functionapp kind on Azure Functions projects** ([#9779](https://github.com/dotnet/aspire/pull/9779)) +- **Make verify tool accessible to the coding agent** ([#9778](https://github.com/dotnet/aspire/pull/9778)) +- **Default ACA autoConfigureDataProtection to true for .NET projects** ([#9777](https://github.com/dotnet/aspire/pull/9777)) +- **Quarantine flaky test WithHttpCommand_CallsGetResponseCallback_AfterSendingRequest** ([#9776](https://github.com/dotnet/aspire/pull/9776)) +- **Revert "Make verify tool accessible to the coding agent (#9753)"** ([#9775](https://github.com/dotnet/aspire/pull/9775)) +- **Allow YARP to be configured in a programmatic way** ([#9766](https://github.com/dotnet/aspire/pull/9766)) +- **[main] Update dependencies from dotnet/arcade** ([#9760](https://github.com/dotnet/aspire/pull/9760)) +- **Improve/Fix hierarchical partition keys for Azure Cosmos** ([#9758](https://github.com/dotnet/aspire/pull/9758)) +- **Default to single resource on console logs and metrics pages** ([#9757](https://github.com/dotnet/aspire/pull/9757)) +- **Make verify tool accessible to the coding agent** ([#9753](https://github.com/dotnet/aspire/pull/9753)) +- **Fix error CSS** ([#9750](https://github.com/dotnet/aspire/pull/9750)) +- **Start localizing CLI** ([#9741](https://github.com/dotnet/aspire/pull/9741)) +- **Simplify AzureProvisioner and make it testable by removing unnecessary abstraction layers** ([#9737](https://github.com/dotnet/aspire/pull/9737)) +- **Disable failing test WithHttpCommand_ResultsInExpectedResultForHttpMethod** ([#9730](https://github.com/dotnet/aspire/pull/9730)) +- **more instructions** ([#9726](https://github.com/dotnet/aspire/pull/9726)) +- **Quarantine flaky test CanOverrideLaunchProfileViaArgsAdHocBuilder** ([#9721](https://github.com/dotnet/aspire/pull/9721)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9720](https://github.com/dotnet/aspire/pull/9720)) +- **[release/9.3] Skip role assignment handling for emulators (#9705)** ([#9716](https://github.com/dotnet/aspire/pull/9716)) +- **Use a persistent container network if there are persistent container resources** ([#9715](https://github.com/dotnet/aspire/pull/9715)) +- **Speed up/robustify copilot setup step** ([#9710](https://github.com/dotnet/aspire/pull/9710)) +- **Skip role assignment handling for emulators** ([#9705](https://github.com/dotnet/aspire/pull/9705)) +- **Add IAzureComputeEnvironmentResource interface for Azure-backed compute** ([#9700](https://github.com/dotnet/aspire/pull/9700)) +- **Ensure resource non-endpoint URLs are active when initialized** ([#9696](https://github.com/dotnet/aspire/pull/9696)) +- **CosmosDB: Add the 'EnableServerless' capability to accounts** ([#9692](https://github.com/dotnet/aspire/pull/9692)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9689](https://github.com/dotnet/aspire/pull/9689)) +- **[release/9.3] Fix the state propagation for azure resources** ([#9687](https://github.com/dotnet/aspire/pull/9687)) +- **Fix the state propagation for azure resources** ([#9686](https://github.com/dotnet/aspire/pull/9686)) +- **Launch cli with proper params, remove unused strings and old command logic** ([#9684](https://github.com/dotnet/aspire/pull/9684)) +- **bump version of azure.provisioning to 1.0.1** ([#9680](https://github.com/dotnet/aspire/pull/9680)) +- **Add missing imports, move rpc server test file** ([#9678](https://github.com/dotnet/aspire/pull/9678)) +- **Add aspire config commands for managing configuration settings** ([#9676](https://github.com/dotnet/aspire/pull/9676)) +- **Quarantine some flaky tests** ([#9675](https://github.com/dotnet/aspire/pull/9675)) +- **Update Docker Image tags** ([#9674](https://github.com/dotnet/aspire/pull/9674)) +- **ParallelOptions not being passed to Parallel.ForEachAsync in FindAppHostProjectFilesAsync** ([#9661](https://github.com/dotnet/aspire/pull/9661)) +- **Update using-latest-daily.md** ([#9658](https://github.com/dotnet/aspire/pull/9658)) +- **Rename WithBrowserPort to WithHostPort for consistency with other hosting packages** ([#9657](https://github.com/dotnet/aspire/pull/9657)) +- **Fix thread safety issue in FindAppHostProjectFilesAsync by switching to ConcurrentBag** ([#9655](https://github.com/dotnet/aspire/pull/9655)) +- **[CI] Use ⚠️emoji for zero tests run** ([#9654](https://github.com/dotnet/aspire/pull/9654)) +- **Add definitions for new log streaming options** ([#9644](https://github.com/dotnet/aspire/pull/9644)) +- **change 2->8 cores for copilot setup build** ([#9626](https://github.com/dotnet/aspire/pull/9626)) +- **Update verify and remove AddTextExtension** ([#9625](https://github.com/dotnet/aspire/pull/9625)) +- **Add support for containers with Dockerfile to AzureAppServiceEnvironmentResource** ([#9620](https://github.com/dotnet/aspire/pull/9620)) +- **Add GetSecret convenience API and WithSecret methods for AzureKeyVaultResource** ([#9615](https://github.com/dotnet/aspire/pull/9615)) +- **[Automated] Update Playground Manifests** ([#9610](https://github.com/dotnet/aspire/pull/9610)) +- **Only expose endpoint port in docker compose if external is set to true** ([#9604](https://github.com/dotnet/aspire/pull/9604)) +- **Revert "Add definitions for new log streaming options (#9593)"** ([#9601](https://github.com/dotnet/aspire/pull/9601)) +- **Remove dependencies on AfterEndpointsAllocatedEvent** ([#9598](https://github.com/dotnet/aspire/pull/9598)) +- **Add definitions for new log streaming options** ([#9593](https://github.com/dotnet/aspire/pull/9593)) +- **[CI] Collect dcp logs on Outerloop workflow** ([#9584](https://github.com/dotnet/aspire/pull/9584)) +- **Initial Aspire extension code** ([#9578](https://github.com/dotnet/aspire/pull/9578)) +- **ci: set commit-message in refresh-manifests workflow** ([#9574](https://github.com/dotnet/aspire/pull/9574)) +- **Remove 37 unused resources from .resx files** ([#9573](https://github.com/dotnet/aspire/pull/9573)) +- **Allow scheme to be specified when configuring Azurite** ([#9570](https://github.com/dotnet/aspire/pull/9570)) +- **[Automated] Update Manifests** ([#9562](https://github.com/dotnet/aspire/pull/9562)) +- **Improve app host search messaging and add spacing for better UX** ([#9552](https://github.com/dotnet/aspire/pull/9552)) +- **[main] Update dependencies from microsoft/usvc-apiserver** ([#9549](https://github.com/dotnet/aspire/pull/9549)) +- **[Automated] Update Manifests** ([#9548](https://github.com/dotnet/aspire/pull/9548)) +- **Rename Aspire.Components.Common.Tests to Aspire.Components.Common.TestUtilities** ([#9547](https://github.com/dotnet/aspire/pull/9547)) +- **AppHost disambiguation and selection.** ([#9542](https://github.com/dotnet/aspire/pull/9542)) +- **[release/9.3] branding for 9.3.1** ([#9539](https://github.com/dotnet/aspire/pull/9539)) +- **Fix Dev Container / Codespaces support for non-default usernames** ([#9538](https://github.com/dotnet/aspire/pull/9538)) +- **[release/9.3] fix markdown lint in release/9.3** ([#9536](https://github.com/dotnet/aspire/pull/9536)) +- **Split Azure tests by resource in Aspire.Hosting.Azure.Tests** ([#9527](https://github.com/dotnet/aspire/pull/9527)) +- **[Automated] Update Manifests** ([#9525](https://github.com/dotnet/aspire/pull/9525)) +- **TestShop: Add IsRunMode check for database key** ([#9522](https://github.com/dotnet/aspire/pull/9522)) +- **Update refresh-manifests.yml** ([#9514](https://github.com/dotnet/aspire/pull/9514)) +- **Support hierarchical partition keys for Azure Cosmos** ([#9513](https://github.com/dotnet/aspire/pull/9513)) +- **Allow mounting the docker socket using WithBindMount** ([#9511](https://github.com/dotnet/aspire/pull/9511)) +- **The --source argument is not preserved when running aspire add -s** ([#9509](https://github.com/dotnet/aspire/pull/9509)) +- **[main] Update dependencies from dotnet/arcade** ([#9507](https://github.com/dotnet/aspire/pull/9507)) +- **Repo MCP tools** ([#9506](https://github.com/dotnet/aspire/pull/9506)) +- **Change .dotnet/aspire to .aspire in temporary working files** ([#9505](https://github.com/dotnet/aspire/pull/9505)) +- **Automate refreshing manifests with GitHub Action** ([#9503](https://github.com/dotnet/aspire/pull/9503)) +- **Expose the NameOutputReference property on AzureResources** ([#9501](https://github.com/dotnet/aspire/pull/9501)) +- **Drop support for hybrid mode Azure Container Apps** ([#9500](https://github.com/dotnet/aspire/pull/9500)) +- **Fix malformed table output in aspire run command when no resources are present** ([#9498](https://github.com/dotnet/aspire/pull/9498)) +- **Remove leftover ElasticSearch references after moving ElasticSearch out of repo** ([#9494](https://github.com/dotnet/aspire/pull/9494)) +- **[WIP] Aspire CLI ctrl+c error message** ([#9491](https://github.com/dotnet/aspire/pull/9491)) +- **Use orchestrator container delay start feature for better `WithExplictStart` + `ContainerLifetime.Persistent` support** ([#9471](https://github.com/dotnet/aspire/pull/9471)) +- **[CI] Use the local test report generator for Outerloop workflow** ([#9439](https://github.com/dotnet/aspire/pull/9439)) +- **Bump to latest azure-functions-core-tools** ([#9267](https://github.com/dotnet/aspire/pull/9267)) +- **[Automated] Update dependencies** ([#9252](https://github.com/dotnet/aspire/pull/9252)) + +## 💔 Breaking changes + +Every release aims to improve .NET Aspire for you. Sometimes, these updates might affect your existing projects. Here are the breaking changes in .NET Aspire 9.4, so you can plan and adjust with confidence. + +- [Breaking changes in .NET Aspire 9.4](../compatibility/9.4/index.md) diff --git a/docs/whats-new/index.yml b/docs/whats-new/index.yml index b31cea2c23..28b1417787 100644 --- a/docs/whats-new/index.yml +++ b/docs/whats-new/index.yml @@ -5,13 +5,15 @@ summary: Welcome to what's new in .NET Aspire docs. Use this page to quickly fin metadata: title: .NET Aspire what's new? description: Learn about new and updated content in .NET Aspire docs. - ms.date: 07/01/2025 + ms.date: 07/03/2025 ms.topic: landing-page landingContent: - title: .NET Aspire release documentation linkLists: - linkListType: whats-new links: + - text: What's new in .NET Aspire 9.4 + url: dotnet-aspire-9.4.md - text: What's new in .NET Aspire 9.3 url: dotnet-aspire-9.3.md - text: What's new in .NET Aspire 9.2 diff --git a/docs/whats-new/toc.yml b/docs/whats-new/toc.yml index 47030c3dee..3ee29a2508 100644 --- a/docs/whats-new/toc.yml +++ b/docs/whats-new/toc.yml @@ -6,6 +6,8 @@ items: - name: Latest product updates expanded: true items: + - name: What's new in .NET Aspire 9.4 + href: dotnet-aspire-9.4.md - name: What's new in .NET Aspire 9.3 href: dotnet-aspire-9.3.md - name: What's new in .NET Aspire 9.2