{"record":{"id":"bc4eaa8c6866915c","repo":"dotnetcore/CAP","slug":"specified-method-is-not-supported-inodediscoveryprovider","errorCode":null,"errorMessage":"Specified method is not supported.","messagePattern":"Specified method is not supported\\.","errorType":"exception","errorClass":"NotImplementedException","httpStatus":null,"severity":"error","filePath":"src/DotNetCore.CAP.Dashboard/NodeDiscovery/INodeDiscoveryProvider.cs","lineNumber":19,"sourceCode":"﻿// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace DotNetCore.CAP.Dashboard.NodeDiscovery;\n\npublic interface INodeDiscoveryProvider\n{\n    Task<IList<Node>> GetNodes(string ns = null, CancellationToken cancellationToken = default);\n\n    Task<Node> GetNode(string nodeName, string ns = null, CancellationToken cancellationToken = default);\n\n    Task RegisterNode(CancellationToken cancellationToken = default)\n    {\n        throw new NotImplementedException();\n    }\n\n    Task<List<string>> GetNamespaces(CancellationToken cancellationToken)\n    {\n        return Task.FromResult(new List<string>());\n    }\n\n    Task<IList<Node>> ListServices(string ns = null)\n    {\n        throw new NotImplementedException();\n    }\n}","sourceCodeStart":1,"sourceCodeEnd":31,"githubUrl":"https://github.com/dotnetcore/CAP/blob/e52b8508e54cdb7a9ce7f9fec03d9ea8ad2710fb/src/DotNetCore.CAP.Dashboard/NodeDiscovery/INodeDiscoveryProvider.cs#L1-L31","documentation":"INodeDiscoveryProvider provides a default interface implementation (DIM, C# 8) for RegisterNode that just throws NotImplementedException. Providers that do not override it (any custom provider relying on the default) will always fail when CAP attempts to register the current node with the discovery backend (e.g. Consul).","triggerScenarios":"Using an INodeDiscoveryProvider implementation that does not override RegisterNode, triggered when the CAP dashboard/node discovery feature starts up and tries to register the node.","commonSituations":"Writing a custom discovery provider and forgetting to implement RegisterNode; calling RegisterNode on the interface directly in tests; version upgrades where the default method body throws instead of no-oping.","solutions":["Override RegisterNode in your provider with real registration logic (e.g. PUT to Consul agent service endpoint).","If registration is irrelevant for your provider, override it with a completed task: return Task.CompletedTask; or a no-op.","Use a shipped provider (ConsulDiscoveryProvider) that implements RegisterNode.","Wrap the discovery startup call in try-catch so a stub provider does not break app boot."],"exampleFix":"// before\n// custom provider relies on interface default\npublic class MyProvider : INodeDiscoveryProvider { /* no RegisterNode */ }\n// after\npublic Task RegisterNode(CancellationToken cancellationToken = default)\n    => Task.CompletedTask; // or implement real registration","handlingStrategy":"try-catch","validationCode":"if (provider.GetType().GetMethod(\"RegisterNode\").DeclaringType == typeof(INodeDiscoveryProvider))\n    throw new InvalidOperationException(\"Provider does not implement RegisterNode\");","typeGuard":"static bool ImplementsRegisterNode(INodeDiscoveryProvider p) =>\n    p.GetType().GetMethod(\"RegisterNode\")!.DeclaringType != typeof(INodeDiscoveryProvider);","tryCatchPattern":"try { await provider.RegisterNode(ct); }\ncatch (NotImplementedException) { logger.LogWarning(\"Provider {Type} does not support node registration\", provider.GetType().Name); }","preventionTips":["Override every default interface method you rely on when writing custom providers","Write a startup smoke test that calls RegisterNode/ListServices against the configured provider","Prefer shipped providers (Consul) unless you need a custom backend"],"tags":["not-implemented","interface-default-method","node-discovery","dotnet"],"backgroundTag":"method-not-implemented","analyzedSha":"e52b8508e54cdb7a9ce7f9fec03d9ea8ad2710fb","analyzedAt":"2026-09-14T14:46:34.677Z","contentChangedAt":"2026-09-14T14:46:34.677Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}