基于 ABP Framework 8.x 的 GeoServer REST API 客户端模块,提供对 GeoServer REST API 的完整封装。项目采用分层架构设计,将契约定义、实现逻辑和 HTTP API 暴露分离到三个独立的类库项目中。
技术栈:
- .NET 8.0 + C#
- ABP Framework 8.3.4
- ASP.NET Core MVC
- System.Text.Json
- IHttpClientFactory
目标: 为 GeoServer 的地图服务管理提供一个类型安全、可测试、可扩展的 .NET 客户端 SDK。
ABP.GeoServerRest.slnx
├── ABP.GeoServerRest.HttpContracts (契约层)
├── ABP.GeoServerRest.HttpClient (实现层)
└── ABP.GeoServerRest.HttpApi (API 暴露层)
HttpContracts ← HttpClient ← HttpApi
(抽象/模型) (实现) (MVC端点)
- HttpContracts — 定义接口、DTO 模型、配置选项,不包含任何实现
- HttpClient — 依赖 HttpContracts,实现所有业务服务接口和 HTTP 客户端
- HttpApi — 依赖 HttpClient,通过 ASP.NET Core MVC 控制器暴露 REST 端点
契约层 — 定义与 GeoServer REST API 交互所需的所有抽象。
| 子目录 | 说明 |
|---|---|
| Configuration/ | 客户端配置选项 GeoServerRestClientOptions(BaseUrl、Username、Password、TimeoutSeconds) |
| Http/ | HTTP 客户端抽象接口 IGeoServerHttpClient + 自定义异常 GeoServerRequestException |
| Models/ | 数据模型(DTO),覆盖 GeoServer 所有资源类型:Workspace、Layer、LayerGroup、Style、DataStore、Coverage、FeatureType、Security 等 |
| Services/ | 34 个业务服务接口,每个接口对应一类 GeoServer REST API 资源 |
关键接口:
- IGeoServerHttpClient — 定义 GET/POST/PUT/DELETE 四个基础 HTTP 方法
- IWorkspaceService — 工作区 CRUD
- ILayerService — 图层管理
- IStyleService — 样式管理(含 SLD)
- ISecurityService — 安全设置
实现层 — 基于 IHttpClientFactory 实现所有业务服务。
| 子目录 | 说明 |
|---|---|
| Configuration/ | 配置扩展方法 AddGeoServerRestClient |
| Http/ | GeoServerHttpClient — IGeoServerHttpClient 的 IHttpClientFactory 实现 |
| Localization/ | 本地化资源(简体中文) |
| Services/ | 34 个服务的具体实现,通过 Named HttpClient "GeoServerRestClient" 调用 GeoServer REST API |
核心特性:
- Named HttpClient 自动配置 Basic 认证
- 统一的异常处理(
GeoServerRequestException) - 支持强类型反序列化(Workspace、Layer 等)和原始字符串返回
- 方法均为
virtual,支持继承扩展
API 暴露层 — 通过 ASP.NET Core MVC 控制器暴露 GeoServer API 端点。
| 子目录 | 说明 |
|---|---|
| Controllers/ | MVC 控制器:API 规格查看 + 通用代理 |
| Localization/ | API 层本地化资源 |
| Permissions/ | 权限常量与定义提供者 |
API 端点:
| 路由 | 方法 | 权限 | 说明 |
|---|---|---|---|
/api/geoserver/spec |
GET | Spec | 获取 GeoServer REST API 规格文档 |
/api/geoserver/proxy/{**path} |
GET/POST/PUT/DELETE | Proxy | 通用代理,透传请求到 GeoServer |
在应用层模块中添加对 ABP.GeoServerRest.HttpApi 的项目引用,或直接引用 ABP.GeoServerRest.HttpClient 后自行注册。
// 在应用模块的 ConfigureServices 中
services.AddGeoServerRestClient(options =>
{
options.BaseUrl = "http://localhost:8080/geoserver";
options.Username = "admin";
options.Password = "geoserver";
options.TimeoutSeconds = 30;
});public class MyService : ITransientDependency
{
private readonly IWorkspaceService _workspaceService;
public MyService(IWorkspaceService workspaceService)
{
_workspaceService = workspaceService;
}
public async Task ListWorkspacesAsync()
{
var workspaces = await _workspaceService.GetWorkspacesAsync();
foreach (var ws in workspaces)
{
Console.WriteLine($"Workspace: {ws.Name}");
}
}
}项目遵循 ABP 模块化设计的最佳实践:
- HttpContracts 作为纯抽象层,可单独发布为 NuGet 包供其他项目引用接口定义
- HttpClient 层使用
ITransientDependency实现自动注册,无需手动配置 DI - HttpApi 层通过权限机制(Spec/Proxy)控制 API 访问
所有 HTTP 请求失败时统一抛出 GeoServerRequestException,包含 HTTP 状态码和响应内容。
- 所有服务方法均为
virtual,支持通过继承重写 - 支持通过 ABP 选项模式自定义 HttpClient 配置
- 可在 HttpApi 层通过自定义中间件扩展代理行为
| 属性 | 值 |
|---|---|
| 作者 | LuciusVorus |
| 公司 | LuciusVorus |
| 许可 | MIT |
| 标签 | geoserver; rest-api; geospatial; gis; abp; module |