{"record":{"id":"2990d7c4d7b4e5f8","repo":"microsoft/aspire","slug":"argumentnullexception-for-parameter-callback-callback-is","errorCode":null,"errorMessage":"ArgumentNullException for parameter 'callback' (callback is null).","messagePattern":"ArgumentNullException for parameter 'callback' \\(callback is null\\)\\.","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting/ApplicationModel/CertificateTrustConfigurationCallbackAnnotation.cs","lineNumber":18,"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.Diagnostics.CodeAnalysis;\nusing System.Security.Cryptography.X509Certificates;\n\nnamespace Aspire.Hosting.ApplicationModel;\n\n/// <summary>\n/// An annotation that indicates a resource wants to manage how custom certificate trust is configured.\n/// </summary>\n/// <param name=\"callback\">The callback used to customize certificate trust for the resource.</param>\npublic sealed class CertificateTrustConfigurationCallbackAnnotation(Func<CertificateTrustConfigurationCallbackAnnotationContext, Task> callback) : IResourceAnnotation\n{\n    /// <summary>\n    /// Gets the callback to invoke to populate or modify the certificate authority collection.\n    /// </summary>\n    public Func<CertificateTrustConfigurationCallbackAnnotationContext, Task> Callback { get; } = callback ?? throw new ArgumentNullException(nameof(callback));\n}\n\n/// <summary>\n/// Context provided to a <see cref=\"CertificateTrustConfigurationCallbackAnnotation\"/> callback.\n/// </summary>\npublic sealed class CertificateTrustConfigurationCallbackAnnotationContext\n{\n    /// <summary>\n    /// Gets the <see cref=\"DistributedApplicationExecutionContext\"/> for this session.\n    /// </summary>\n    public required DistributedApplicationExecutionContext ExecutionContext { get; init; }\n\n    /// <summary>\n    /// Gets the resource to which the annotation is applied.\n    /// </summary>\n    public required IResource Resource { get; init; }\n\n    /// <summary>","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting/ApplicationModel/CertificateTrustConfigurationCallbackAnnotation.cs#L1-L36","documentation":"CertificateTrustConfigurationCallbackAnnotation wraps a callback that customizes certificate trust for a resource. The constructor requires a non-null callback; passing null throws ArgumentNullException for parameter 'callback'.","triggerScenarios":"new CertificateTrustConfigurationCallbackAnnotation(null) or passing a variable/chain that resolves to null (e.g. a conditional expression yielding null, or a method returning a null Func).","commonSituations":"Building annotations dynamically where the callback delegate was never assigned; refactoring removed the lambda but left the annotation; dependency injection failed to supply the delegate.","solutions":["Pass a valid async callback, e.g. ctx => { ...; return Task.CompletedTask; }","If the annotation is conditional, only add it when the callback delegate is available","Null-check the delegate at the call site before constructing the annotation"],"exampleFix":"// before\nresource.Annotations.Add(new CertificateTrustConfigurationCallbackAnnotation(null));\n// after\nresource.Annotations.Add(new CertificateTrustConfigurationCallbackAnnotation(context =>\n{\n    context.CertificateTrustConfiguration... // customize trust\n    return Task.CompletedTask;\n}));","handlingStrategy":"validation","validationCode":"if (callback is null) throw new InvalidOperationException(\"Certificate trust callback must be configured before adding the annotation.\");","typeGuard":null,"tryCatchPattern":"try { ann = new CertificateTrustConfigurationCallbackAnnotation(callback); } catch (ArgumentNullException) { ann = new CertificateTrustConfigurationCallbackAnnotation(DefaultTrustCallback); }","preventionTips":["Pass lambda callbacks inline rather than nullable delegate variables","Only add the annotation when the callback is available","Null-check delegates sourced from DI or options"],"tags":["null-argument","annotation","certificate"],"backgroundTag":"null-argument","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"}