Honua.Sdk.Admin
1.13.1
dotnet add package Honua.Sdk.Admin --version 1.13.1
NuGet\Install-Package Honua.Sdk.Admin -Version 1.13.1
<PackageReference Include="Honua.Sdk.Admin" Version="1.13.1" />
<PackageVersion Include="Honua.Sdk.Admin" Version="1.13.1" />
<PackageReference Include="Honua.Sdk.Admin" />
paket add Honua.Sdk.Admin --version 1.13.1
#r "nuget: Honua.Sdk.Admin, 1.13.1"
#:package Honua.Sdk.Admin@1.13.1
#addin nuget:?package=Honua.Sdk.Admin&version=1.13.1
#tool nuget:?package=Honua.Sdk.Admin&version=1.13.1
Honua.Sdk.Admin
REST client for the Honua Admin API: service settings, metadata resources and manifests, secure database connections, published layers, styles, identity providers, RBAC, users, license, observability, deploy plans, alert rules, feature-event replay, and streaming subscriber operations. Also ships the portal-style Catalog client and the GeoServices-compatible Geocoding client.
Part of the Honua .NET SDK — see the repo README for the full package catalog, browser/WASM support, authentication, and release policy.
Install
Stable releases are on nuget.org and install anonymously. An unversioned add resolves to the newest stable release (the current SDK version is in the repo README). Prereleases stay on the authenticated GitHub Packages feed; see INSTALL.md.
dotnet add package Honua.Sdk.Admin
Quick usage
using Honua.Sdk.Admin;
using Honua.Sdk.Admin.Extensions;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddHonuaAdmin(o => o.BaseAddress = new Uri("https://your-honua-server"));
var provider = services.BuildServiceProvider();
var client = provider.GetRequiredService<IHonuaAdminClient>();
var compatibility = await client.CheckCompatibilityAsync(cancellationToken);
var summaries = await client.ListServicesAsync(cancellationToken);
foreach (var service in summaries)
{
var settings = await client.GetServiceSettingsAsync(service.ServiceName, cancellationToken);
Console.WriteLine($"{service.ServiceName}: {string.Join(',', settings.EnabledProtocols)}");
}
For application code, prefer the narrow sub-interface that matches the
workflow instead of depending on the aggregate IHonuaAdminClient.
AddHonuaAdmin registers all sub-interfaces against the same underlying
HonuaAdminClient.
using Honua.Sdk.Admin.Models;
var users = provider.GetRequiredService<IHonuaAdminUsersClient>();
var permissions = await users.GetEffectivePermissionsAsync(
"user-operator",
cancellationToken);
var alerts = provider.GetRequiredService<IHonuaAdminAlertsClient>();
var rules = await alerts.ListAlertRulesAsync(
serviceId: "parcels",
layerId: 1,
cancellationToken);
var events = provider.GetRequiredService<IHonuaAdminFeatureEventsClient>();
var replay = await events.ReplayFeatureEventsAsync(
new FeatureEventReplayQuery { Cursor = 1001, Limit = 100 },
cancellationToken);
GeoServices/migration import lifecycle
Discover an ArcGIS service, queue a single-layer import, and wait for it to reach a terminal status without ever risking a duplicate import on retry:
using Honua.Sdk.Admin.Models;
var admin = provider.GetRequiredService<IHonuaAdminClient>();
var discovered = await admin.DiscoverGeoservicesServiceAsync(new GeoservicesDiscoverRequest
{
ServiceUrl = "https://gis.example.com/arcgis/rest/services/Parcels/FeatureServer",
Credentials = new GeoservicesCredentialDescriptor
{
Mode = "token",
AccessTokenSecretReference = "secret://arcgis/token"
}
});
var job = await admin.StartGeoservicesImportAsync(new GeoservicesStartImportRequest
{
ServiceUrl = discovered.ServiceUrl,
LayerId = discovered.Layers[0].Id,
TableName = "parcels",
TargetSrid = 4326,
AutoPublish = true
});
// Reconnects to the job by polling status only; safe to call again after a
// client restart because it never re-invokes StartGeoservicesImportAsync.
var terminal = await admin.WaitForGeoservicesImportJobAsync(job.JobId);
if (terminal.Status is GeoservicesImportStatus.NeedsReview)
{
var findings = terminal.ReconciliationArtifact!.Reasons;
Console.WriteLine($"Import needs review: {string.Join("; ", findings)}");
}
Import several dependency-ordered layers as one resumable batch, and poll its rolled-up status plus per-child job ids:
var batch = await admin.StartMigrationBatchAsync(new MigrationBatchStartRequest
{
SourceKind = "arcgis-geoservices-rest",
Layers =
[
new MigrationBatchLayerSpec
{
SourceResourceId = "res:parcels",
ServiceUrl = discovered.ServiceUrl,
LayerId = 0,
TableName = "parcels"
},
new MigrationBatchLayerSpec
{
SourceResourceId = "res:zoning",
ServiceUrl = discovered.ServiceUrl,
LayerId = 1,
TableName = "zoning",
DependsOn = ["res:parcels"]
}
]
});
var status = await admin.GetMigrationBatchAsync(batch.BatchId);
foreach (var child in status.Children)
{
Console.WriteLine($"{child.SourceResourceId}: {child.Status} (job {child.JobId})");
}
Independently, retrieve a migration run's signed reconciliation scorecard once the run (recorded separately by the migration engine) completes:
var scorecard = await admin.GetMigrationRunReconciliationScorecardAsync(runId);
Console.WriteLine($"Data reconciliation verdict: {scorecard.Verdict}");
Console control-plane contracts
The Admin package includes the stable Console P0 control-plane surface used by Blazor Web and MAUI hosts:
| Workflow | Interface |
|---|---|
| Service, layer, protocol, connection, style, manifest, deploy, and compatibility operations | IHonuaAdminClient or the existing narrow service-specific interfaces |
| Route guard roles and permission grants | IHonuaAdminRolesClient |
| User list, role assignment, deprovisioning, and effective permissions | IHonuaAdminUsersClient |
| Alert zones and alert rules | IHonuaAdminAlertsClient |
| Feature-change replay pages | IHonuaAdminFeatureEventsClient |
| Streaming subscriber list and disconnect | IHonuaAdminStreamingOperationsClient |
Most Admin endpoints use the server's ApiResponse<T> envelope and are
unwrapped before returning typed SDK models. Table discovery returns raw
TableDiscoveryResponse, and feature-event replay returns raw
FeatureEventReplayResponse, because those current server endpoints are not
envelope-wrapped. Admin requests are emitted as camelCase JSON, while response
binding is case-insensitive so the server's current PascalCase replay payload
(Events, NextCursor, HasMore, and event fields) binds to
FeatureEventReplayResponse. Non-success HTTP statuses throw
HonuaAdminApiException; successful responses that fail the expected contract
throw HonuaAdminOperationException.
Catalog and Geocoding
using Honua.Sdk.Admin.Catalog;
using Honua.Sdk.Admin.Geocoding;
services.AddHonuaCatalog(o => o.BaseAddress = new Uri("https://your-honua-server"));
services.AddHonuaGeocoding(o => o.BaseAddress = new Uri("https://your-honua-server"));
var catalog = provider.GetRequiredService<IHonuaCatalogClient>();
var hits = await catalog.SearchAsync(
new CatalogQueryOptions { Query = "parcels", Limit = 25 },
cancellationToken);
var geocoder = provider.GetRequiredService<IHonuaGeocodingClient>();
var candidates = await geocoder.ForwardGeocodeAsync(
"1600 Amphitheatre Pkwy, Mountain View, CA",
options: null,
cancellationToken);
Raster import (write/output)
IHonuaAdminRasterImportClient (part of IHonuaAdminClient) uploads a raster into
PostGIS via the admin import endpoint. This is the write half of the raster
geoprocessing round-trip; the read half is the read-only IHonuaRasterDataClient
(ReadWindowAsync) in Honua.Sdk.GeoServices.
var admin = provider.GetRequiredService<IHonuaAdminClient>();
await using var tiff = File.OpenRead("output.tif");
var result = await admin.ImportRasterAsync(new RasterImportRequest
{
Content = tiff,
FileName = "output.tif",
LayerId = 7,
Name = "GP result",
Srid = 4326,
}, cancellationToken);
var formats = await admin.GetSupportedRasterFormatsAsync(cancellationToken);
Server compatibility
IHonuaAdminClient.CheckCompatibilityAsync reports whether the connected Honua
Server matches this SDK baseline. See
compatibility.md
for the policy and supported version matrix.
Documentation
License
Publishing an editable layer
Set both the storage mode and capabilities when publishing a layer intended for edits. Leaving either option null omits it and preserves the server default.
var layer = await admin.PublishLayerAsync(connectionId, new PublishLayerRequest
{
Schema = "public",
Table = "parcels",
LayerName = "Parcels",
StorageMode = "managed",
Capabilities = ["Query", "Create", "Update", "Delete"]
}, cancellationToken);
The server validates storage modes and capability combinations. Catalog discovery uses service and FeatureServer routes by default; groups, saved source descriptors and metadata-only filters require the legacy metadata-resource API and propagate server errors when unsupported.
| 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
- Honua.Sdk.Abstractions (>= 1.13.1)
- Microsoft.Extensions.Http (>= 10.0.7)
- Microsoft.Extensions.Http.Resilience (>= 10.5.0)
- Microsoft.Extensions.Options (>= 10.0.7)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Honua.Sdk.Admin:
| Package | Downloads |
|---|---|
|
Honua.Sdk
Umbrella / meta package for the Honua .NET SDK. Installing this package brings in every other Honua.Sdk.* package and exposes a single AddHonua(o => o.BaseAddress = ...) DI registration that fans out across every enabled sub-package. Use the narrower per-package facades (Honua.Sdk.Grpc, Honua.Sdk.Admin, etc.) directly if you want to depend on less. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.13.1 | 406 | 10/26/2026 |
| 1.12.0 | 1,971 | 10/19/2026 |
| 1.11.1 | 3,372 | 10/13/2026 |
| 1.11.0 | 2,358 | 10/12/2026 |
| 1.10.4 | 1,872 | 10/7/2026 |
| 1.10.3 | 516 | 10/5/2026 |
| 1.10.2 | 279 | 10/4/2026 |
| 1.10.1 | 878 | 9/29/2026 |
| 1.10.0 | 432 | 9/25/2026 |
| 1.9.0 | 136 | 9/25/2026 |
| 1.8.0 | 1,223 | 9/16/2026 |
| 1.7.0 | 236 | 9/15/2026 |
| 1.6.4 | 117 | 9/12/2026 |