dotnetcore/CAP · error · NotImplementedException

Specified method is not supported.

Error message

Specified method is not supported.

What it means

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).

Solutions

  1. Override RegisterNode in your provider with real registration logic (e.g. PUT to Consul agent service endpoint).
  2. If registration is irrelevant for your provider, override it with a completed task: return Task.CompletedTask; or a no-op.
  3. Use a shipped provider (ConsulDiscoveryProvider) that implements RegisterNode.
  4. Wrap the discovery startup call in try-catch so a stub provider does not break app boot.

Example fix

// before
// custom provider relies on interface default
public class MyProvider : INodeDiscoveryProvider { /* no RegisterNode */ }
// after
public Task RegisterNode(CancellationToken cancellationToken = default)
    => Task.CompletedTask; // or implement real registration
Defensive patterns

Strategy: try-catch

Validate before calling

if (provider.GetType().GetMethod("RegisterNode").DeclaringType == typeof(INodeDiscoveryProvider))
    throw new InvalidOperationException("Provider does not implement RegisterNode");

Type guard

static bool ImplementsRegisterNode(INodeDiscoveryProvider p) =>
    p.GetType().GetMethod("RegisterNode")!.DeclaringType != typeof(INodeDiscoveryProvider);

Try / catch

try { await provider.RegisterNode(ct); }
catch (NotImplementedException) { logger.LogWarning("Provider {Type} does not support node registration", provider.GetType().Name); }

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of dotnetcore/CAP@e52b8508e5 (2026-09-14). Data as JSON: /api/errors/bc4eaa8c6866915c. Report an issue: GitHub.

Appendix: source

Thrown at src/DotNetCore.CAP.Dashboard/NodeDiscovery/INodeDiscoveryProvider.cs:19

// Copyright (c) .NET Core Community. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace DotNetCore.CAP.Dashboard.NodeDiscovery;

public interface INodeDiscoveryProvider
{
    Task<IList<Node>> GetNodes(string ns = null, CancellationToken cancellationToken = default);

    Task<Node> GetNode(string nodeName, string ns = null, CancellationToken cancellationToken = default);

    Task RegisterNode(CancellationToken cancellationToken = default)
    {
        throw new NotImplementedException();
    }

    Task<List<string>> GetNamespaces(CancellationToken cancellationToken)
    {
        return Task.FromResult(new List<string>());
    }

    Task<IList<Node>> ListServices(string ns = null)
    {
        throw new NotImplementedException();
    }
}

View on GitHub (pinned to e52b8508e5)