microsoft/aspire · error · RadiusBackingResourceProjectionException
ASPIRERADIUS069
ASPIRERADIUS069
Error message
Endpoints of '{resource.Name}' cannot be resolved because it is provisioned by a Radius recipe rather than deployed as a container. The recipe owns its Kubernetes Service and its credentials, so no address derived from the Aspire endpoint model describes it. Within a Radius deployment the publisher projects the recipe's own host/port outputs instead. If you are publishing to Kubernetes, Azure Container Apps, or Azure App Service, a consumer there cannot reach '{resource.Name}' through the Radius environment: deploy '{resource.Name}' to the same compute environment as its consumer, or supply the address explicitly with WithEnvironment. Diagnostic: ASPIRERADIUS069. What it means
Resources provisioned by a Radius recipe do not run as containers; their Kubernetes Service and credentials are owned by the recipe, so no address derived from the Aspire endpoint model describes them. This guard (ASPIRERADIUS069) prevents resolving a host address expression for recipe-provisioned backing resources. Within a Radius deployment the publisher projects the recipe's own host/port outputs instead.
Solutions
- Deploy the consuming service to the same Radius/compute environment as the backing resource
- Supply the address explicitly with WithEnvironment instead of relying on endpoint resolution
- Provision the resource as a container or external resource rather than via a Radius recipe
- Move the consumer into the Radius deployment so the publisher can project the recipe's outputs
Example fix
// before
var redis = builder.AddRedis("cache"); // recipe-provisioned in Radius
var api = builder.AddProject<Projects.Api>("api").WithReference(redis);
// after
var api = builder.AddProject<Projects.Api>("api")
.WithEnvironment("ConnectionStrings__cache", builder.AddParameter("cache-connection")); Defensive patterns
Strategy: validation
Validate before calling
if (ResourceTypeMapper.IsBackingResource(resource)) { /* avoid endpoint address resolution; supply address via WithEnvironment */ } Try / catch
try { address = GetEndpointAddress(resourceRef); } catch (RadiusBackingResourceProjectionException ex) when (ex.Message.Contains("ASPIRERADIUS069")) { address = configuration["Cache__Host"] ?? throw new InvalidOperationException("Provide explicit address for recipe-provisioned resource"); } Prevention
- Only use WithReference/endpoint resolution for container-deployed resources
- Deploy consumers to the same Radius environment as recipe-backed resources
- Supply explicit addresses with WithEnvironment for cross-environment consumers
When it happens
Trigger: Calling GetHostAddressExpression or GuardedAddress (via endpoint reference resolution, connection strings, or WithReference environment injection) for a resource where ResourceTypeMapper.IsBackingResource returns true — i.e. a recipe-provisioned backing resource — while not in Radius publisher projection context.
Common situations: Adding a recipe-provisioned resource (e.g. Redis or Postgres via Radius recipe) and referencing it from a service that will be published to Kubernetes, ACA, or App Service outside the Radius environment; consumers there cannot reach the resource through the Radius environment.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- A ConfigureRadiusInfrastructure callback removed or…
- A recipe parameter on Radius environment
- A recipe parameter on Radius environment
- ASPIRERADIUS064
- ASPIRERADIUS070
AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16).
Data as JSON: /api/errors/0d5d6d3dd6309c7f.
Report an issue: GitHub.
Appendix: source
Thrown at src/Aspire.Hosting.Radius/RadiusEnvironmentResource.cs:297
// which describes where the resource lives. They are instead guarded by
// ThrowIfTransportSecurityIsNotRecipeBacked, which rejects them only when the endpoint is
// TLS-enabled — the one case in which the local endpoint declaration can disagree with what the
// recipe actually deploys.
private static void ThrowIfBackingResource(IResource resource)
{
// Child resources (a database on a server, say) are represented by their parent in the
// Radius model, so classify against the resource Radius actually emits.
if (resource is IResourceWithParent child)
{
resource = child.Parent;
}
if (!ResourceTypeMapper.IsBackingResource(resource))
{
return;
}
throw new RadiusBackingResourceProjectionException(
resource,
$"Endpoints of '{resource.Name}' cannot be resolved because it is provisioned by a Radius recipe rather " +
$"than deployed as a container. The recipe owns its Kubernetes Service and its credentials, so no address " +
$"derived from the Aspire endpoint model describes it. Within a Radius deployment the publisher projects " +
$"the recipe's own host/port outputs instead. If you are publishing to Kubernetes, Azure Container Apps, " +
$"or Azure App Service, a consumer there cannot reach '{resource.Name}' through the Radius environment: " +
$"deploy '{resource.Name}' to the same compute environment as its consumer, or supply the address " +
$"explicitly with WithEnvironment. Diagnostic: ASPIRERADIUS069.");
}
// Mirrors the private helpers on IComputeEnvironmentResource so this override reproduces the
// default port semantics (only the port *source* differs — Radius uses the Service/container
// port instead of the proxy/host port).
private static int GetDefaultPort(string scheme, EndpointAnnotation endpoint)
{
if (string.Equals(scheme, "http", StringComparison.OrdinalIgnoreCase))
{
return 80;View on GitHub (pinned to 25830f84bd)