{"record":{"id":"1e7f01b5b3404feb","repo":"dotnet/yarp","slug":"nameof-key-cannot-be-null-or-empty","errorCode":null,"errorMessage":"'{nameof(key)}' cannot be null or empty.","messagePattern":"'(.+?)' cannot be null or empty\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/ReverseProxy/Transforms/QueryParameterFromRouteTransform.cs","lineNumber":15,"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;\n\nnamespace Yarp.ReverseProxy.Transforms;\n\npublic class QueryParameterRouteTransform : QueryParameterTransform\n{\n    public QueryParameterRouteTransform(QueryStringTransformMode mode, string key, string routeValueKey)\n        : base(mode, key)\n    {\n        if (string.IsNullOrEmpty(key))\n        {\n            throw new ArgumentException($\"'{nameof(key)}' cannot be null or empty.\", nameof(key));\n        }\n\n        if (string.IsNullOrEmpty(routeValueKey))\n        {\n            throw new ArgumentException($\"'{nameof(routeValueKey)}' cannot be null or empty.\", nameof(routeValueKey));\n        }\n\n        RouteValueKey = routeValueKey;\n    }\n\n    internal string RouteValueKey { get; }\n\n    /// <inheritdoc/>\n    protected override string? GetValue(RequestTransformContext context)\n    {\n        var routeValues = context.HttpContext.Request.RouteValues;\n        if (!routeValues.TryGetValue(RouteValueKey, out var value))\n        {","sourceCodeStart":1,"sourceCodeEnd":33,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/QueryParameterFromRouteTransform.cs#L1-L33","documentation":"Thrown by the QueryParameterRouteTransform constructor when `key` is null or empty. The `key` is the query-parameter name to set/append; the base QueryParameterTransform also validates it, but this subclass re-checks to give an explicit ArgumentException before delegating to the base. A blank key produces an invalid query string.","triggerScenarios":"Constructing `new QueryParameterRouteTransform(mode, key, routeValueKey)` with `key` null/empty, or via transform config that omits the query key.","commonSituations":"Config sets `Set`/`Append` query transform from route but leaves `key` blank. Programmatically building the transform from a config value that defaulted to empty.","solutions":["Provide a non-empty query-parameter name for `key`.","If sourced from config, validate the key is present before constructing.","Ensure the transform config block has all required keys."],"exampleFix":"// before\nnew QueryParameterRouteTransform(QueryStringTransformMode.Append, \"\", \"userId\");\n// after\nnew QueryParameterRouteTransform(QueryStringTransformMode.Append, \"uid\", \"userId\");","handlingStrategy":"validation","validationCode":"ArgumentException.ThrowIfNullOrEmpty(key);","typeGuard":"static bool IsValidQueryKey(string? key) => !string.IsNullOrEmpty(key);","tryCatchPattern":null,"preventionTips":["Require a non-empty query key in config binding.","Use ArgumentException.ThrowIfNullOrEmpty before constructing.","Add startup validation for query-transform config."],"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"}