microsoft/aspire · error · ArgumentException

Manifest field path must contain at least one segment.

Error message

Manifest field path must contain at least one segment.

What it means

ParseFieldPath splits a dotted manifest field path (e.g. "spec.replicas") into segments and requires at least one non-empty segment. It throws ArgumentException when the path is null, whitespace-only, or composed entirely of dots, since there would be no field to address.

Solutions

  1. Pass a non-empty dotted path such as "spec.replicas" to the manifest field API.
  2. Validate the configured path string (not null/whitespace) before calling WithField.
  3. Trim surrounding whitespace and remove accidental leading/trailing dots from the path before use.

Example fix

// before
resource.WithField(path, value); // path == ""
// after
if (string.IsNullOrWhiteSpace(path))
{
    throw new InvalidOperationException("Manifest field path is not configured.");
}
resource.WithField(path, value);
Defensive patterns

Strategy: validation

Validate before calling

if (string.IsNullOrWhiteSpace(path) || path.Split('.', StringSplitOptions.RemoveEmptyEntries).Length == 0)
{
    throw new ArgumentException("Field path must name at least one segment, e.g. 'spec.replicas'.", nameof(path));
}

Type guard

static bool IsValidFieldPath(string? path) =>
    !string.IsNullOrWhiteSpace(path) && path.Split('.', StringSplitOptions.RemoveEmptyEntries).Length > 0;

Try / catch

try
{
    resource.WithField(path, value);
}
catch (ArgumentException ex) when (ex.Message.Contains("at least one segment"))
{
    // path was null/whitespace/all dots; fix configuration and rethrow or default
}

Prevention

When it happens

Trigger: Calling WithField/manifest field APIs with an empty string, whitespace, or a path like "..."; passing a string variable that was never initialized from config.

Common situations: Field path read from a config value or JSON key that is empty in the current environment; a typo leaving a constant empty; string interpolation producing only separators.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at src/Aspire.Hosting.Kubernetes/KubernetesManifestResource.cs:103

    public KubernetesManifestResource WithField(
        string path,
        [AspireUnion(typeof(string), typeof(double), typeof(bool))] object value)
    {
        var segments = ParseFieldPath(path);

        SetField(Fields, segments, path, NormalizeManifestValue(value));

        return this;
    }

    private static string[] ParseFieldPath(string path)
    {
        ArgumentException.ThrowIfNullOrWhiteSpace(path);

        var segments = path.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
        if (segments.Length == 0)
        {
            throw new ArgumentException("Manifest field path must contain at least one segment.", nameof(path));
        }

        if (segments[0] is "apiVersion" or "kind" or "metadata")
        {
            throw new ArgumentException("Use the dedicated manifest API to configure apiVersion, kind, and metadata fields.", nameof(path));
        }

        return segments;
    }

    private static void SetField(Dictionary<string, object?> fields, ReadOnlySpan<string> segments, string path, object? value)
    {
        var current = fields;

        for (var i = 0; i < segments.Length - 1; i++)
        {
            var segment = segments[i];
            if (current.TryGetValue(segment, out var child))

View on GitHub (pinned to 25830f84bd)