{"record":{"id":"3405ee4ac0cbcbaf","repo":"dotnet/yarp","slug":"unknown-transform-string-join-rawtransform","errorCode":null,"errorMessage":"Unknown transform: {string.Join(';', rawTransform.Keys)}","messagePattern":"Unknown transform: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/ReverseProxy/Transforms/Builder/TransformBuilder.cs","lineNumber":129,"sourceCode":"        };\n\n        if (rawTransforms?.Count > 0)\n        {\n            foreach (var rawTransform in rawTransforms)\n            {\n                var handled = false;\n                foreach (var factory in _factories)\n                {\n                    if (factory.Build(context, rawTransform))\n                    {\n                        handled = true;\n                        break;\n                    }\n                }\n\n                if (!handled)\n                {\n                    throw new ArgumentException($\"Unknown transform: {string.Join(';', rawTransform.Keys)}\");\n                }\n            }\n        }\n\n        // Let the app add any more transforms it wants.\n        foreach (var transformProvider in _providers)\n        {\n            transformProvider.Apply(context);\n        }\n\n        return CreateTransformer(context);\n    }\n\n    public HttpTransformer Create(Action<TransformBuilderContext> action)\n    {\n        return CreateInternal(action);\n    }\n","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/Builder/TransformBuilder.cs#L111-L147","documentation":"Thrown by TransformBuilder.Build when no registered transform factory recognizes a raw transform entry. The builder iterates all `_factories`; if none returns true from `factory.Build(context, rawTransform)`, the entry's keys are joined and reported as unknown. Indicates a typo, an unsupported transform, or a missing transform extension.","triggerScenarios":"Route config contains a transforms entry whose keys do not match any registered transform factory (e.g. misspelled `PathSetFromAppService`, a custom transform name not registered, or an unknown shorthand key).","commonSituations":"Typo in transform key. Using a transform that requires a NuGet package/extension not referenced. Custom transform factory not added via `AddTransforms<TFactory>()`. YARP version mismatch where a transform was renamed.","solutions":["Check the transform key spelling against the YARP transforms documentation (e.g. `PathRemovePrefix`, `RequestHeader`, `XForwarded`).","If it's a custom transform, register its factory with `builder.AddTransforms<MyFactory>()` or `AddTransform(context => ...)` before config is loaded.","Ensure any transform-extension package (e.g. session-affinity transforms) is referenced.","Compare the reported keys in the error against the keys your factory expects."],"exampleFix":"// before\n{ \"Transforms\": [ { \"PathSetPrefx\": \"/api\" } ] }\n// after\n{ \"Transforms\": [ { \"PathRemovePrefix\": \"/api\" } ] }","handlingStrategy":"validation","validationCode":"var knownKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { \"PathRemovePrefix\", \"PathSet\", \"RequestHeader\", /* ... */ };\nif (!knownKeys.Overlaps(rawTransform.Keys)) throw new ArgumentException($\"Unknown transform: {string.Join(';', rawTransform.Keys)}\");","typeGuard":"static bool IsKnownTransform(IReadOnlyDictionary<string,string> raw, ITransformFactory[] factories) =>\n    factories.Any(f => f.Build(new TransformBuilderContext(), raw));","tryCatchPattern":null,"preventionTips":["Register custom transform factories with AddTransforms before loading config.","Reference transform extension packages your config relies on.","Validate route config in a test environment that enumerates all transform keys."],"tags":["transforms","config","yarp"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}