{"record":{"id":"68de2a9b7c26bf52","repo":"microsoft/aspire","slug":"port-range-start-must-be-less-than-or-equal-to-the-range-end","errorCode":null,"errorMessage":"Port range start must be less than or equal to the range end.","messagePattern":"Port range start must be less than or equal to the range end\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting/Dcp/PortRange.cs","lineNumber":48,"sourceCode":"    /// <summary>\n    /// Validates that <paramref name=\"rangeStart\"/> and <paramref name=\"rangeEnd\"/> form a valid,\n    /// non-empty, ordered port range, throwing if not.\n    /// </summary>\n    public static void ValidateRange(int rangeStart, int rangeEnd, string rangeStartParamName, string rangeEndParamName)\n    {\n        if (!IsValidPort(rangeStart))\n        {\n            throw new ArgumentOutOfRangeException(rangeStartParamName, rangeStart, $\"Port range start must be between {MinPort} and {MaxPort}.\");\n        }\n\n        if (!IsValidPort(rangeEnd))\n        {\n            throw new ArgumentOutOfRangeException(rangeEndParamName, rangeEnd, $\"Port range end must be between {MinPort} and {MaxPort}.\");\n        }\n\n        if (rangeStart > rangeEnd)\n        {\n            throw new ArgumentException(\"Port range start must be less than or equal to the range end.\", rangeStartParamName);\n        }\n    }\n}\n","sourceCodeStart":30,"sourceCodeEnd":52,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting/Dcp/PortRange.cs#L30-L52","documentation":"Thrown by PortRange.ValidateRange when both endpoints are individually valid ports but rangeStart exceeds rangeEnd, i.e. the range is inverted. Raised as ArgumentException on the start parameter to enforce an ordered, non-empty range.","triggerScenarios":"Calling ValidateRange(9000, 8000) — start greater than end — or ranges where config substitution swapped the values (e.g. env vars ASPORT_END set lower than ASPORT_START).","commonSituations":"Swapped environment variables or config keys for the port range; refactoring that reordered positional arguments to ValidateRange.","solutions":["Swap the values so start <= end.","Clamp: use start = Math.Min(a, b), end = Math.Max(a, b) when accepting user input.","Add a startup validation that rejects inverted ranges with a clear config message."],"exampleFix":"// before\nPortRange.ValidateRange(9000, 8000, nameof(start), nameof(end));\n// after\nPortRange.ValidateRange(8000, 9000, nameof(start), nameof(end));","handlingStrategy":"validation","validationCode":"(start, end) = (Math.Min(a, b), Math.Max(a, b)); // normalize before ValidateRange","typeGuard":null,"tryCatchPattern":"try { PortRange.ValidateRange(start, end, nameof(start), nameof(end)); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"less than or equal\")) { /* swap or fix config */ }","preventionTips":["Accept ranges as ordered (low, high) and normalize with Min/Max.","Check env vars aren't swapped when port ranges come from configuration.","Add a startup assertion that configured ranges are ordered."],"tags":["ports","invalid-argument","configuration"],"backgroundTag":"invalid-argument-value","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T09:17:21.228Z"}