microsoft/aspire · error · InvalidOperationException

Unknown solver type ' ' on issuer ' '.

Error message

Unknown solver type '{solver.GetType().Name}' on issuer '{issuer.Name}'.

What it means

AppendSolver renders each challenge solver into the ClusterIssuer manifest YAML and switches on the solver's concrete type. An unrecognized solver type hits the default arm and throws InvalidOperationException naming the type and issuer, since Aspire cannot emit YAML for it.

Solutions

  1. Use the supported solver extension, e.g. WithHttp01Solver().
  2. If you need DNS-01, use a supported DNS solver extension rather than a custom solver object.
  3. Align package versions so solver types match the manifest generator.
  4. Extend AppendSolver/manifest generation if you own a custom solver type.

Example fix

// before
issuer.Solvers.Add(new MyCustomDnsSolver());

// after
issuerBuilder.WithHttp01Solver();
Defensive patterns

Strategy: type-guard

Validate before calling

if (solver is not Http01Solver) throw new InvalidOperationException($"Solver type {solver.GetType().Name} not supported");

Type guard

bool IsSupportedSolver(object solver) => solver is Http01Solver;

Try / catch

try { await manifestBuilder.BuildAsync(); }
catch (InvalidOperationException ex) when (ex.Message.StartsWith("Unknown solver type")) { /* replace custom solver with WithHttp01Solver */ throw; }

Prevention

When it happens

Trigger: An issuer's Solvers collection contains a solver implementation unknown to AppendSolver — typically a custom solver added by user code or a type introduced by a newer package version than the publisher supports.

Common situations: Writing a custom WithDns01-style extension that adds a bespoke solver object, or a version mismatch where a solver type was added in a newer Aspire version than the one generating the manifest.

Related errors


AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16). Data as JSON: /api/errors/15fb7bddc0d06836. Report an issue: GitHub.

Appendix: source

Thrown at src/Aspire.Hosting.Kubernetes/CertManagerExtensions.cs:667

                            issuer.Name,
                            certManager.Parent.Name,
                            issuer.Name);
                        return;
                    }

                    sb.AppendLine("          parentRefs:");
                    foreach (var gateway in parentGateways)
                    {
                        sb.AppendLine("            - group: gateway.networking.k8s.io");
                        sb.AppendLine("              kind: Gateway");
                        // Match the metadata.name normalization used by BuildGatewayObjects so
                        // the parentRef resolves to the actual Gateway in the cluster.
                        sb.Append("              name: ").AppendLine(gateway.Name.ToKubernetesResourceName());
                    }
                    break;
                }
            default:
                throw new InvalidOperationException(
                    $"Unknown solver type '{solver.GetType().Name}' on issuer '{issuer.Name}'.");
        }
    }
}

View on GitHub (pinned to 25830f84bd)