{"record":{"id":"18aeee9b7f1c6512","repo":"dotnet/yarp","slug":"unexpected-parameters-for-responseheader-string","errorCode":null,"errorMessage":"Unexpected parameters for ResponseHeader: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'","messagePattern":"Unexpected parameters for ResponseHeader: (.+?)\\. Expected 'Set' or 'Append'","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/ReverseProxy/Transforms/ResponseTransformFactory.cs","lineNumber":163,"sourceCode":"                TransformHelpers.CheckTooManyParameters(transformValues, expected: 3);\n                condition = Enum.Parse<ResponseCondition>(whenValue, ignoreCase: true);\n            }\n            else\n            {\n                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);\n            }\n\n            if (transformValues.TryGetValue(SetKey, out var setValue))\n            {\n                context.AddResponseHeader(responseHeaderName, setValue, append: false, condition);\n            }\n            else if (transformValues.TryGetValue(AppendKey, out var appendValue))\n            {\n                context.AddResponseHeader(responseHeaderName, appendValue, append: true, condition);\n            }\n            else\n            {\n                throw new ArgumentException($\"Unexpected parameters for ResponseHeader: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'\");\n            }\n        }\n        else if (transformValues.TryGetValue(ResponseTrailerKey, out var responseTrailerName))\n        {\n            var condition = ResponseCondition.Success;\n            if (transformValues.TryGetValue(WhenKey, out var whenValue))\n            {\n                TransformHelpers.CheckTooManyParameters(transformValues, expected: 3);\n                condition = Enum.Parse<ResponseCondition>(whenValue, ignoreCase: true);\n            }\n            else\n            {\n                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);\n            }\n\n            if (transformValues.TryGetValue(SetKey, out var setValue))\n            {\n                context.AddResponseTrailer(responseTrailerName, setValue, append: false, condition);","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/ResponseTransformFactory.cs#L145-L181","documentation":"Thrown by ResponseTransformFactory.Build when a 'ResponseHeader' transform key is present but neither 'Set' nor 'Append' is among the sibling keys. Uses ArgumentException with a descriptive message listing the actual keys. An optional 'When' key (Always/Success/Failure) may also be present. The Validate method reports the same condition non-throwing at config load.","triggerScenarios":"A transform dictionary like { \"ResponseHeader\": \"X-Foo\" } with no Set/Append. Reaches Build when config validation is skipped or transforms are built programmatically.","commonSituations":"appsettings.json transform missing the Set/Append line; typo'd key (e.g. lowercase 'set'); a config-generated route emitting an incomplete transform object.","solutions":["Add 'Set' or 'Append' to the entry, e.g. { \"ResponseHeader\": \"X-Foo\", \"Set\": \"bar\" }.","Fix key-name typos — keys are case-sensitive.","Keep startup config validation enabled so this is reported at startup.","When building in code, assert Set or Append is present before calling Build."],"exampleFix":"// before\n{ \"ResponseHeader\": \"X-Powered-By\" }\n// after\n{ \"ResponseHeader\": \"X-Powered-By\", \"Set\": \"YARP\", \"When\": \"Always\" }","handlingStrategy":"validation","validationCode":"if (transformValues.ContainsKey(\"ResponseHeader\")\n    && !transformValues.ContainsKey(\"Set\")\n    && !transformValues.ContainsKey(\"Append\"))\n{\n    throw new InvalidOperationException(\n        \"ResponseHeader transform requires 'Set' or 'Append'.\");\n}","typeGuard":"static bool IsValidResponseHeaderTransform(IReadOnlyDictionary<string, string> t)\n    => t.ContainsKey(\"ResponseHeader\")\n       && (t.ContainsKey(\"Set\") || t.ContainsKey(\"Append\"));","tryCatchPattern":null,"preventionTips":["Keep YARP startup config validation enabled.","Validate transform dictionaries in code before calling Build.","When using an optional 'When' key, still ensure Set or Append is present."],"tags":["yarp","config","transforms","headers","response"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}