{"record":{"id":"b0e4557fdb55debf","repo":"dotnet/yarp","slug":"key-cannot-be-null-or-empty-b0e455","errorCode":null,"errorMessage":"'key' cannot be null or empty.","messagePattern":"'key' cannot be null or empty\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/ReverseProxy/Transforms/QueryParameterTransform.cs","lineNumber":16,"sourceCode":"// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Primitives;\n\nnamespace Yarp.ReverseProxy.Transforms;\n\npublic abstract class QueryParameterTransform : RequestTransform\n{\n    public QueryParameterTransform(QueryStringTransformMode mode, string key)\n    {\n        if (string.IsNullOrEmpty(key))\n        {\n            throw new ArgumentException($\"'{nameof(key)}' cannot be null or empty.\", nameof(key));\n        }\n\n        Mode = mode;\n        Key = key;\n    }\n\n    internal QueryStringTransformMode Mode { get; }\n\n    internal string Key { get; }\n\n    /// <inheritdoc/>\n    public override ValueTask ApplyAsync(RequestTransformContext context)\n    {\n        ArgumentNullException.ThrowIfNull(context);\n\n        var value = GetValue(context);\n        if (value is not null)\n        {","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/QueryParameterTransform.cs#L1-L34","documentation":"Thrown by the abstract QueryParameterTransform base constructor when `key` is null or empty. All query-parameter transforms (Set/Append/Remove/Route/Static) derive from this, so a blank key is caught centrally. Re-checks by subclasses produce more specific messages, but the base is the final guard.","triggerScenarios":"Constructing any subclass of QueryParameterTransform with a null/empty `key`, where the subclass does not itself short-circuit the check first.","commonSituations":"Direct instantiation of a query transform subclass with an empty key, or a subclass that relies solely on the base validation.","solutions":["Provide a non-empty query-parameter name when constructing any QueryParameterTransform subclass.","Validate the key upstream in config binding.","If writing a subclass, document that key must be non-empty."],"exampleFix":"// before\n: base(QueryStringTransformMode.Set, \"\")\n// after\n: base(QueryStringTransformMode.Set, \"q\")","handlingStrategy":"validation","validationCode":"ArgumentException.ThrowIfNullOrEmpty(key);","typeGuard":"static bool IsValidQueryKey(string? key) => !string.IsNullOrEmpty(key);","tryCatchPattern":null,"preventionTips":["Never pass an empty key to any QueryParameterTransform subclass.","Centralize query-transform construction behind a helper that validates the key.","Add startup config validation for query-transform keys."],"tags":["transforms","query-string","argument-validation","yarp"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}