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

  1. Deploy the consuming service to the same Radius/compute environment as the backing resource
  2. Supply the address explicitly with WithEnvironment instead of relying on endpoint resolution
  3. Provision the resource as a container or external resource rather than via a Radius recipe
  4. 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

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


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)