Skip to content

Fix persistent container endpoint allocation#17960

Merged
joperezr merged 5 commits into
release/13.4from
danegsta/persistent-container-endpoints
Jun 5, 2026
Merged

Fix persistent container endpoint allocation#17960
joperezr merged 5 commits into
release/13.4from
danegsta/persistent-container-endpoints

Conversation

@danegsta

@danegsta danegsta commented Jun 5, 2026

Copy link
Copy Markdown
Member

Description

Persistent container endpoints should behave like normal container endpoints unless the app explicitly opts out of proxy support. This keeps persistent containers compatible with integrations that depend on endpoint allocation happening before resource startup.

This change updates DCP endpoint allocation so persistent containers default to proxied endpoints unless isProxied: false or WithEndpointProxySupport(false) is applied. It also removes the delayed proxyless container allocation path and restores the previous target-port fallback: proxyless container endpoints with a targetPort and no public port immediately use the target port as the allocated host/public port.

For HTTP health checks, this restores the 13.3 timing split: endpoint existence is still validated during ResourceEndpointsAllocatedEvent, while the health-check URI is bound during BeforeResourceStartedEvent. That matters for supported surrogate-resource integrations such as the KeyVault emulator, where the surrogate forwards BeforeResourceStartedEvent but not ResourceEndpointsAllocatedEvent.

The endpoint allocation event is intentionally kept on the 13.4 BlockingSequential dispatch behavior, rather than matching 13.3's NonBlockingConcurrent dispatch. That preserves 13.4 exception propagation and ensures allocation subscribers complete before startup continues.

User-facing behavior

Proxyless container endpoints now resolve immediately when only a target port is specified:

builder.AddContainer("cache", "redis")
       .WithEndpoint(targetPort: 6379, isProxied: false);

That endpoint allocates public/host port 6379 instead of waiting for a delayed allocation update. Persistent executables keep their existing default proxyless behavior.

Breaking changes

This changes endpoint allocation timing and default endpoint behavior for container scenarios. Users who depended on delayed runtime allocation for proxyless container endpoints without an explicit public port should specify the desired public port explicitly or rely on the restored target-port default.

Validation included the DCP executor test suite and a real KeyVault emulator smoke test for both session and persistent container lifetimes.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Default persistent container endpoints to proxied unless proxy support is disabled, and remove delayed proxyless container endpoint allocation in favor of target-port public port defaults. Preserve endpoint and connection string event timing from release/13.3 and add coverage for the KeyVault emulator-style health check path.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17960

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 17960"

Set HTTP health check URIs during BeforeResourceStartedEvent again so surrogate resource builders that forward startup events continue to initialize their health checks. Add DCP coverage for the KeyVault-emulator-style surrogate pattern.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danegsta danegsta marked this pull request as ready for review June 5, 2026 18:42
Copilot AI review requested due to automatic review settings June 5, 2026 18:42
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adjusts DCP endpoint allocation to make persistent container endpoints behave like normal container endpoints (proxied by default), removes the delayed proxyless allocation mechanism, and restores the proxyless targetPort-as-hostPort default. Also re-splits HTTP health check work so endpoint existence is validated on ResourceEndpointsAllocatedEvent, while the health check URI is bound on BeforeResourceStartedEvent for surrogate-forwarding scenarios.

Changes:

  • Default persistent container endpoints to proxied unless explicitly proxyless / proxy support disabled; restore proxyless targetPort host-port defaulting.
  • Remove delayed/on-demand proxyless container port allocation plumbing and related test fake behavior.
  • Move HTTP health check URI binding to BeforeResourceStartedEvent, keeping endpoint existence validation during ResourceEndpointsAllocatedEvent.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/Aspire.Hosting.Tests/DistributedApplicationTests.cs Updates expectations for proxyless container port behavior (targetPort defaults host/public port).
tests/Aspire.Hosting.Tests/Dcp/TestKubernetesService.cs Removes fake “late allocation” path; service port allocation now aligns with targetPort defaulting.
tests/Aspire.Hosting.Tests/Dcp/DcpExecutorTests.cs Adds coverage for persistent container proxy defaults, targetPort defaulting behavior, and health check URI binding timing.
src/Aspire.Hosting/ResourceBuilderExtensions.cs Moves HTTP health check URI binding to OnBeforeResourceStarted; keeps endpoint existence check during endpoint allocation.
src/Aspire.Hosting/Dcp/DcpResourceWatcher.cs Stops publishing endpoints-allocated events on service updates; applies observed service address directly to endpoints.
src/Aspire.Hosting/Dcp/DcpModelUtilities.cs Removes dynamic proxyless allocation helpers and simplifies service->endpoint application APIs.
src/Aspire.Hosting/Dcp/DcpExecutor.cs Reorders/changes endpoint allocation publishing and defaults persistent container endpoints to proxied.
src/Aspire.Hosting/Dcp/ContainerCreator.cs Builds proxyless container port mappings using resolved EndpointAnnotation.Port (targetPort defaulted).
src/Aspire.Hosting/ApplicationModel/OnDemandEndpointAllocationAnnotation.cs Removes the on-demand endpoint allocation annotation type.
src/Aspire.Hosting/ApplicationModel/EndpointReference.cs Removes endpoint allocation “on-demand” fallback; relies on allocated endpoint snapshots directly.
src/Aspire.Hosting/ApplicationModel/EndpointAnnotation.cs Removes SpecifiedPort and relies on Port semantics (including proxyless targetPort default).

Comment thread src/Aspire.Hosting/Dcp/DcpExecutor.cs
Comment thread tests/Aspire.Hosting.Tests/Dcp/DcpExecutorTests.cs
Keep ResourceEndpointsAllocatedEvent dispatch aligned with release/13.4 so subscriber exceptions propagate and endpoint allocation callbacks complete before startup proceeds.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danegsta

danegsta commented Jun 5, 2026

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

CLI Version Verification

  • Expected (PR head short SHA): 4e3be3c
  • Installed CLI version: 13.4.3-pr.17960.g4e3be3c5
  • Status: ✅ Verified — version suffix matches PR head commit

Changes Analyzed

Hosting-only change to DCP endpoint allocation:

  • src/Aspire.Hosting/Dcp/{DcpExecutor,DcpModelUtilities,ContainerCreator,DcpResourceWatcher}.cs
  • src/Aspire.Hosting/ApplicationModel/{EndpointAnnotation,EndpointReference}.cs (removed OnDemandEndpointAllocationAnnotation)
  • src/Aspire.Hosting/ResourceBuilderExtensions.cs (health-check URI binding moved to BeforeResourceStartedEvent)
  • eng/Versions.props, plus DCP/distributed-app tests

Change Categories

  • Hosting integration changes
  • CLI changes
  • Dashboard changes
  • Template changes
  • Client/Component changes
  • Test changes

Test Setup

A single file-based AppHost (apphost.cs) was created from the PR hive (aspire new aspire-empty) with four traefik/whoami containers, run locally with aspire start against real Docker + DCP, then inspected with aspire describe, curl, and docker inspect.

Test Scenarios Executed

Scenario 1: Proxyless container endpoint with only a target port (happy path)

Config: AddContainer("proxyless","traefik/whoami").WithArgs("--port","8088").WithEndpoint(targetPort: 8088, scheme:"http", isProxied:false)
Expected: Allocated host/public port == target port (8088), reachable directly.
Result: ✅ Passed — aspire describe URL http://localhost:8088; Docker mapping 127.0.0.1:8088->8088/tcp; curl localhost:8088 returned a whoami response. State Running / Health Healthy.

Scenario 2: Persistent container defaults to proxied (happy path)

Config: AddContainer("persistentproxied","traefik/whoami").WithHttpEndpoint(targetPort: 80).WithLifetime(ContainerLifetime.Persistent)
Expected: Endpoint is proxied (random host port, not the target port); container starts cleanly; persistent label true.
Result: ✅ Passed — proxied URL http://localhost:64828 (random), Docker mapping ...:64864->80/tcp, label com.microsoft.developer.usvc-dev.persistent=true. State Running / Health Healthy.

Scenario 3: HTTP health check on a container endpoint — KeyVault-emulator-style timing (happy path)

Config: AddContainer("healthcheck","traefik/whoami").WithHttpEndpoint(targetPort: 80).WithHttpHealthCheck("/")
Expected: Resource reaches Healthy (health-check URI bound at BeforeResourceStartedEvent).
Result: ✅ Passed — aspire describe reported Health = Healthy; proxied endpoint reachable via curl.

Scenario 4: Persistent container with explicit proxyless opt-out (boundary)

Coverage Type: Boundary
Config: AddContainer("persistentproxyless","traefik/whoami").WithArgs("--port","8090").WithEndpoint(targetPort: 8090, scheme:"http", isProxied:false).WithLifetime(ContainerLifetime.Persistent)
Expected: Explicit isProxied:false is honored despite the new persistent→proxied default; host port == target port (8090).
Expected Boundary Outcome: Endpoint stays proxyless and uses the target port rather than being silently upgraded to a proxied endpoint.
Result: ✅ Passed — proxyless URL http://localhost:8090, Docker mapping 127.0.0.1:8090->8090/tcp, reachable via curl. persistent=true label present.

Persistence lifecycle verification (cross-cutting)

After aspire stop, the two session containers (proxyless, healthcheck) were removed, while the two persistent containers (persistentproxied, persistentproxyless) kept running — confirming the persistent lifetime is applied correctly end-to-end. The persistent containers were then cleaned up manually.

aspire describe snapshot (while running)

Name                  Type       State    Health   URLs
healthcheck           Container  Running  Healthy  http://localhost:64827
persistentproxied     Container  Running  Healthy  http://localhost:64828
persistentproxyless   Container  Running  Healthy  http://localhost:8090
proxyless             Container  Running  Healthy  http://localhost:8088

Summary

Scenario Status Notes
1. Proxyless target-port default ✅ Passed host port == 8088, reachable
2. Persistent defaults to proxied ✅ Passed random proxied port, persistent=true
3. HTTP health check timing ✅ Passed Healthy
4. Persistent + explicit proxyless ✅ Passed stays proxyless on 8090
Persistence lifecycle (stop) ✅ Passed session removed, persistent survive

Overall Result

✅ PR VERIFIED — All four scenarios plus the persistence lifecycle check behaved exactly as described in the PR. Proxyless container endpoints resolve to their target port immediately, persistent containers default to proxied while honoring an explicit proxyless opt-out, and container HTTP health checks bind and report Healthy.

Notes

  • Tested on macOS arm64 with Docker Desktop using a file-based C# AppHost and the traefik/whoami image.
  • This is an orchestration/timing change; behavior was validated against a real container runtime rather than only generated artifacts.

Use a fixed public Kafka port for the persistent reuse test and let the shared persistent-container helper disable DCP test port randomization when a test needs explicit ports to remain stable.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
"resource",
useTestContainerRegistry: true);
useTestContainerRegistry: true,
randomizePorts: false);

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Kafka specifically requires the public port to be set in an environment variable, so forcing randomized ports changes the lifecycle key between runs.

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 111 passed, 0 failed, 2 unknown (commit 1273da4)

View all recordings
- Test Detail
AddPackageInteractiveWhileAppHostRunningDetached Recording · Job · CLI logs
AddPackageWhileAppHostRunningDetached Recording · Job · CLI logs
AgentCommands_AllHelpOutputs_AreCorrect Recording · Job · CLI logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording · Job · CLI logs
AgentInitCommand_MigratesDeprecatedConfig Recording · Job · CLI logs
AgentInitCommand_NonInteractive_BundleOnlySkillsBeyondCliCatalog_AreInstallable Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording · Job · CLI logs
AllPublishMethodsBuildDockerImages Recording · Job · CLI logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording · Job · CLI logs
AspireAddPackageVersionToDirectoryPackagesProps Recording · Job · CLI logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording · Job · CLI logs
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles Recording · Job · CLI logs
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive Recording · Job · CLI logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording · Job · CLI logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording · Job · CLI logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording · Job · CLI logs
Banner_DisplayedOnFirstRun Recording · Job · CLI logs
Banner_DisplayedWithExplicitFlag Recording · Job · CLI logs
Banner_NotDisplayedWithNoLogoFlag Recording · Job · CLI logs
CertificatesClean_RemovesCertificates Recording · Job · CLI logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording · Job · CLI logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording · Job · CLI logs
ConfigSetGet_CreatesNestedJsonFormat Recording · Job · CLI logs
CreateAndRunAspireStarterProject Recording · Job · CLI logs
CreateAndRunAspireStarterProjectWithBundle Recording · Job · CLI logs
CreateAndRunEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJavaEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJsReactProject Recording · Job · CLI logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording · Job · CLI logs
CreateAndRunPythonReactProject Recording · Job · CLI logs
CreateAndRunTypeScriptEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunTypeScriptStarterProject Recording · Job · CLI logs
CreateJavaAppHostWithViteApp Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_AllowsGuestAppPackageManagerToDiffer Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DeployK8sBasicApiService Recording · Job · CLI logs
DeployK8sWithExternalHelmChart Recording · Job · CLI logs
DeployK8sWithGarnet Recording · Job · CLI logs
DeployK8sWithMongoDB Recording · Job · CLI logs
DeployK8sWithMySql Recording · Job · CLI logs
DeployK8sWithPostgres Recording · Job · CLI logs
DeployK8sWithRabbitMQ Recording · Job · CLI logs
DeployK8sWithRedis Recording · Job · CLI logs
DeployK8sWithSqlServer Recording · Job · CLI logs
DeployK8sWithValkey Recording · Job · CLI logs
DeployTypeScriptAppToKubernetes Recording · Job · CLI logs
DescribeCommandResolvesReplicaNames Recording · Job · CLI logs
DescribeCommandShowsRunningResources Recording · Job · CLI logs
DetachFormatJsonProducesValidJson Recording · Job · CLI logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording · Job · CLI logs
DoPublishAndDeployListStepsWork Recording · Job · CLI logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording · Job · CLI logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording · Job · CLI logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording · Job · CLI logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording · Job · CLI logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording · Job · CLI logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording · Job · CLI logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording · Job · CLI logs
GlobalMigration_HandlesMalformedLegacyJson Recording · Job · CLI logs
GlobalMigration_PreservesAllValueTypes Recording · Job · CLI logs
GlobalMigration_SkipsWhenNewConfigExists Recording · Job · CLI logs
GlobalSettings_MigratedFromLegacyFormat Recording · Job · CLI logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording · Job · CLI logs
InteractiveCSharpInitCreatesExpectedFiles Recording · Job · CLI logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording · Job · CLI logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording · Job · CLI logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording · Job · CLI logs
LogsCommandShowsResourceLogs Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording · Job · CLI logs
PersistentContainersPreserveDataAcrossAppHostRuns Recording · Job · CLI logs
PsCommandListsRunningAppHost Recording · Job · CLI logs
PsFormatJsonOutputsOnlyJsonToStdout Recording · Job · CLI logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording · Job · CLI logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording · Job · CLI logs
PublishWithDockerComposeServiceCallbackSucceeds Recording · Job · CLI logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording · Job · CLI logs
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries Recording · Job · CLI logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording · Job · CLI logs
RestoreGeneratesSdkFiles Recording · Job · CLI logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording · Job · CLI logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording · Job · CLI logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording · Job · CLI logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
SecretCrudOnDotNetAppHost Recording · Job · CLI logs
SecretCrudOnTypeScriptAppHost Recording · Job · CLI logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording · Job · CLI logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording · Job · CLI logs
StartReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
StopAllAppHostsFromAppHostDirectory Recording · Job · CLI logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopNonInteractiveSingleAppHost Recording · Job · CLI logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopWithNoRunningAppHostExitsSuccessfully Recording · Job · CLI logs
TypeScriptAppHostRunDoesNotDeadlockWhenLazyOptionsInvokeAsyncCallback Recording · Job · CLI logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording · Job · CLI logs
UpdateProjectChannelToStable_CSharpEmptyAppHost_PreservesAspireConfigChannel Recording · Job · CLI logs
UpdateProjectChannelToStable_CSharpSingleFileInit_PreservesAspireConfigChannel Recording · Job · CLI logs
UpdateProjectChannelToStable_TypeScriptSingleFileInit_PreservesAspireConfigChannel Recording · Job · CLI logs
UpdateProjectChannelToStable_TypeScript_PreviewsStablePackagesAndPreservesChannel Recording · Job · CLI logs

📹 Recordings uploaded automatically from CI run #27036216048

@joperezr joperezr merged commit 4f21893 into release/13.4 Jun 5, 2026
618 of 621 checks passed
@joperezr joperezr deleted the danegsta/persistent-container-endpoints branch June 5, 2026 21:56
@github-actions github-actions Bot added this to the 13.4.x milestone Jun 5, 2026
aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Jun 5, 2026
Persistent containers use proxied endpoints by default (same as session
containers), while persistent executables and projects default to proxyless
endpoints. Also document that proxyless container endpoints with only a
targetPort immediately allocate the targetPort as the host port.

Corrects docs that previously stated all persistent resources default to
proxyless endpoints.

Documents changes from microsoft/aspire#17960.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1219

Generated by PR Documentation Check

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1219 targeting release/13.4.

Three documentation files updated to correct the persistent container endpoint proxy default, which was changed by this PR:

  • app-host/resource-lifetimes.mdx: Clarified that persistent containers use proxied endpoints by default (same as session containers), while persistent executables and projects default to proxyless. Added note about proxyless containers with only targetPort immediately allocating that port as the host port.
  • fundamentals/networking-overview.mdx: Corrected three locations (concepts list, Proxyless endpoints section, EndpointAnnotation reference) that previously stated all persistent resources default to proxyless.
  • whats-new/aspire-13-4.mdx: Corrected two locations (feature spotlight Aside and breaking-changes entry) to scope the proxyless-by-default statement to executables and projects only.

Note

This draft PR needs human review before merging.

IEvangelist pushed a commit to microsoft/aspire.dev that referenced this pull request Jun 8, 2026
* Fix persistent container endpoint proxy default docs

Persistent containers use proxied endpoints by default (same as session
containers), while persistent executables and projects default to proxyless
endpoints. Also document that proxyless container endpoints with only a
targetPort immediately allocate the targetPort as the host port.

Corrects docs that previously stated all persistent resources default to
proxyless endpoints.

Documents changes from microsoft/aspire#17960.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
IEvangelist added a commit to microsoft/aspire.dev that referenced this pull request Jun 8, 2026
* Fix persistent container endpoint proxy default docs

Persistent containers use proxied endpoints by default (same as session
containers), while persistent executables and projects default to proxyless
endpoints. Also document that proxyless container endpoints with only a
targetPort immediately allocate the targetPort as the host port.

Corrects docs that previously stated all persistent resources default to
proxyless endpoints.

Documents changes from microsoft/aspire#17960.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants