{"record":{"id":"0c5bcede00ef75e5","repo":"microsoft/aspire","slug":"an-access-rule-named-rule-name-already-exists-in-network","errorCode":null,"errorMessage":"An access rule named '{rule.Name}' already exists in Network Security Perimeter '{builder.Resource.Name}'.","messagePattern":"An access rule named '(.+?)' already exists in Network Security Perimeter '(.+?)'\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Azure.Network/AzureNetworkSecurityPerimeterExtensions.cs","lineNumber":89,"sourceCode":"    ///     {\n    ///         Name = \"allow-outbound-fqdn\",\n    ///         Direction = NetworkSecurityPerimeterAccessRuleDirection.Outbound,\n    ///         FullyQualifiedDomainNames = { \"*.blob.core.windows.net\" }\n    ///     });\n    /// </code>\n    /// </example>\n    [AspireExport]\n    public static IResourceBuilder<AzureNetworkSecurityPerimeterResource> WithAccessRule(\n        this IResourceBuilder<AzureNetworkSecurityPerimeterResource> builder,\n        AzureNspAccessRule rule)\n    {\n        ArgumentNullException.ThrowIfNull(builder);\n        ArgumentNullException.ThrowIfNull(rule);\n        ArgumentException.ThrowIfNullOrEmpty(rule.Name);\n\n        if (builder.Resource.AccessRules.Any(existing => string.Equals(existing.Name, rule.Name, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new ArgumentException(\n                $\"An access rule named '{rule.Name}' already exists in Network Security Perimeter '{builder.Resource.Name}'.\",\n                nameof(rule));\n        }\n\n        builder.Resource.AccessRules.Add(rule);\n        return builder;\n    }\n\n    /// <summary>\n    /// Associates an Azure PaaS resource with a Network Security Perimeter.\n    /// </summary>\n    /// <param name=\"target\">The target PaaS resource builder to associate.</param>\n    /// <param name=\"nsp\">The Network Security Perimeter to associate with.</param>\n    /// <param name=\"accessMode\">\n    /// The access mode for the association. Defaults to <see cref=\"NetworkSecurityPerimeterAssociationAccessMode.Enforced\"/>.\n    /// Use <see cref=\"NetworkSecurityPerimeterAssociationAccessMode.Learning\"/> to log violations without blocking traffic.\n    /// </param>\n    /// <param name=\"associationName\">","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Azure.Network/AzureNetworkSecurityPerimeterExtensions.cs#L71-L107","documentation":"WithAccessRule adds an access rule to an Azure Network Security Perimeter resource. Duplicate rule names (compared case-insensitively) are rejected with ArgumentException because access rules must be uniquely named within the perimeter.","triggerScenarios":"Calling WithAccessRule multiple times on the same NSP builder with rules whose Name values match ignoring case.","commonSituations":"Shared helper methods adding rules with a fixed name, config-driven rules where two entries resolve to the same name, or case-only differences mistaken for uniqueness.","solutions":["Give each access rule a unique name within the perimeter.","Make rule names distinctive by including the target resource or purpose, e.g. $\"{target.Name}-access\".","Audit helper/config code for repeated fixed rule names.","Check existing rules via nsp.Resource.AccessRules before adding dynamically named rules."],"exampleFix":"// before\nnsp.WithAccessRule(new NspAccessRule { Name = \"allow-storage\", ... });\nnsp.WithAccessRule(new NspAccessRule { Name = \"Allow-Storage\", ... });\n// after\nnsp.WithAccessRule(new NspAccessRule { Name = \"allow-storage\", ... });\nnsp.WithAccessRule(new NspAccessRule { Name = \"allow-keyvault\", ... });","handlingStrategy":"validation","validationCode":"if (builder.Resource.AccessRules.Any(r => string.Equals(r.Name, rule.Name, StringComparison.OrdinalIgnoreCase)))\n    throw new ArgumentException($\"Access rule '{rule.Name}' already exists in NSP '{builder.Resource.Name}'.\");","typeGuard":null,"tryCatchPattern":"try { nspBuilder.WithAccessRule(rule); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"already exists\")) { /* skip or rename the duplicate rule */ }","preventionTips":["Derive access rule names from the target resource or purpose to ensure uniqueness.","Do not reuse a shared constant name across WithAccessRule calls.","Account for case-insensitive comparison when generating names.","Check nsp.Resource.AccessRules before conditional rule additions."],"tags":["aspire","azure-network","nsp","duplicate-name"],"backgroundTag":"file-already-exists","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}