Novolis.Transports.Discovery
2026.1.11.85
dotnet add package Novolis.Transports.Discovery --version 2026.1.11.85
NuGet\Install-Package Novolis.Transports.Discovery -Version 2026.1.11.85
<PackageReference Include="Novolis.Transports.Discovery" Version="2026.1.11.85" />
<PackageVersion Include="Novolis.Transports.Discovery" Version="2026.1.11.85" />
<PackageReference Include="Novolis.Transports.Discovery" />
paket add Novolis.Transports.Discovery --version 2026.1.11.85
#r "nuget: Novolis.Transports.Discovery, 2026.1.11.85"
#:package Novolis.Transports.Discovery@2026.1.11.85
#addin nuget:?package=Novolis.Transports.Discovery&version=2026.1.11.85
#tool nuget:?package=Novolis.Transports.Discovery&version=2026.1.11.85
Novolis.Transports.Discovery
Cohort-aware service discovery for local and routed networks. The package provides:
- UDP probe and beacon helpers for zero-configuration LAN discovery.
- DNS SRV/TXT resolution for services published by managed DNS or Tailscale DNS.
- An HTTP(S) lease-registry client for routed networks and coordinated environments.
- A thread-safe
ServiceDiscoveryMapthat merges results from any source.
Install
<PackageReference Include="Novolis.Transports.Discovery" Version="2026.1.*" />
Quick start
Create a query and resolve the matching service registrations:
Every registration has a cohort, serviceName, and instanceId. A caller
can merge multiple sources without making the product protocol part of this
package:
using Novolis.Transports.Discovery;
var query = new ServiceDiscoveryQuery("reach", "host");
var map = new ServiceDiscoveryMap();
var dns = new DnsSrvServiceDiscovery(
new DnsSrvServiceDiscoveryOptions("example.internal"));
var services = await dns.DiscoverAsync(query, cancellationToken);
map.Replace(services);
var hosts = map.Find(query);
ServiceDiscoveryMap is deliberately a snapshot map. Use RefreshAsync for a
one-shot concurrent query of multiple sources, then refresh periodically,
subscribe to a registry stream, or combine DNS with another source as needed.
DNS SRV/TXT
For the query above, the resolver asks for:
_host._tcp.reach.example.internal
Each SRV record becomes one service instance. TXT values at the same name use
key=value syntax and become instance metadata:
_host._tcp.reach.example.internal. 60 IN SRV 0 0 19800 host-a.example.internal.
_host._tcp.reach.example.internal. 60 IN TXT "hostName=host-a" "protocolVersion=1.0"
DNS publishing is intentionally left to the network's DNS or service advertisement system. The resolver works with ordinary DNS servers and does not require a product-specific coordinator.
HTTP(S) lease registry
HttpServiceRegistry uses an intentionally small REST contract:
| Method | Path | Purpose |
|---|---|---|
PUT |
/v1/registrations/{cohort}/{service}/{instance} |
create or renew a lease |
DELETE |
same registration path | remove a lease |
GET |
/v1/services?cohort=...&serviceName=... |
list live registrations |
The PUT body contains the registration plus leaseDurationSeconds. The
registry removes entries after the lease expires, so a stopped process does
not remain in the cohort map indefinitely.
using var http = new HttpClient
{
BaseAddress = new Uri("https://registry.example.internal/"),
};
var registry = new HttpServiceRegistry(
http,
http.BaseAddress);
var registration = new ServiceRegistration(
"reach",
"host",
Environment.MachineName,
new[] { new ServiceEndpoint(new Uri("tcp://10.0.0.25:19800")) },
new Dictionary<string, string>
{
["hostName"] = Environment.MachineName,
["protocolVersion"] = "1.0",
});
var session = new ServiceRegistrationSession(
registry,
registration,
leaseDuration: TimeSpan.FromSeconds(30),
renewalPeriod: TimeSpan.FromSeconds(10));
await session.RunAsync(cancellationToken);
Configure authentication and certificate validation on the supplied
HttpClient; the library does not embed credentials.
UDP compatibility
Use DiscoveryScanner for probes and DiscoveryResponder for generic beacon
responses. These primitives remain available for products such as Reach that
need zero-configuration broadcast discovery on a trusted LAN.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DnsClient (>= 1.8.0)
- Novolis.Transports.Udp (>= 2026.1.11.85)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2026.1.11.85 | 42 | 10/21/2026 |
| 2026.1.11.84 | 74 | 10/20/2026 |
| 2026.1.11.83 | 84 | 10/19/2026 |
| 2026.1.11.82 | 81 | 10/19/2026 |
| 2026.1.11.81 | 78 | 10/19/2026 |
| 2026.1.11.80 | 78 | 10/19/2026 |
| 2026.1.11.79 | 84 | 10/18/2026 |
| 2026.1.11.76 | 86 | 10/18/2026 |
| 2026.1.11.75 | 90 | 10/12/2026 |
| 2026.1.11.61 | 96 | 10/4/2026 |
| 2026.1.1.60 | 98 | 10/4/2026 |
| 2026.1.1.58 | 93 | 10/3/2026 |
| 2026.1.1.57 | 89 | 10/1/2026 |
| 2026.1.1.56 | 100 | 9/30/2026 |