WPF 配置 WebAPI 接口 → 动态生成 API → 自动生成 Swagger → 通过依赖注入动态处理请求 → 作为 WebAPI 模拟器使用
方案基于 .NET 8/9 + Minimal API + Swagger + DI + WPF Host,这是目前最稳定、最灵活、最适合"接口模拟器 / 动态 API"的技术组合。
一、总体架构设计(推荐)
┌──────────────────────────┐
│ WPF UI │
│ - 接口配置(路径/方法) │
│ - 请求参数定义 │
│ - 响应模板(JSON) │
│ - 启停 / 热更新 │
└───────────┬──────────────┘
│
▼
┌──────────────────────────┐
│ ApiDefinitionStore │◄── 内存 / SQLite / JSON
│ - List<ApiDefinition> │
└───────────┬──────────────┘
│
▼
┌──────────────────────────┐
│ ASP.NET Core WebHost │
│ - Minimal API │
│ - Swagger │
│ - Dynamic Endpoint │
│ - DI Handler │
└───────────┬──────────────┘
│
▼
┌──────────────────────────┐
│ IRequestHandler │
│ - MockHandler │
│ - ScriptHandler │
│ - ProxyHandler │
│ - RuleEngineHandler │
└──────────────────────────┘
二、核心数据模型(WPF 配置的"接口定义")
csharp
public class ApiDefinition
{
public string Name { get; set; }
public string Path { get; set; } // /api/test
public string HttpMethod { get; set; } // GET / POST
public string Description { get; set; }
public string RequestSchema { get; set; } // JSON Schema(可选)
public string ResponseTemplate { get; set; } // JSON 模板
public int DelayMs { get; set; } // 模拟延迟
public string HandlerType { get; set; } // Mock / Script / Proxy
}
WPF 只负责维护这份数据(内存、SQLite、JSON 均可)。
三、WPF 中启动 WebAPI(同进程)
csharp
public class WebApiHost
{
private WebApplication _app;
public void Start(List<ApiDefinition> apis)
{
var builder = WebApplication.CreateBuilder();
builder.Services.AddSingleton<ApiDefinitionStore>();
builder.Services.AddScoped<IRequestHandler, MockRequestHandler>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
MapDynamicApis(app);
app.RunAsync("http://localhost:5000");
_app = app;
}
private void MapDynamicApis(WebApplication app)
{
var store = app.Services.GetRequiredService<ApiDefinitionStore>();
app.Map("/{**path}", async (
HttpContext ctx,
IRequestHandler handler) =>
{
return await handler.HandleAsync(ctx);
})
.ExcludeFromDescription(); // 避免吞掉 Swagger
}
}
关键点
- WPF 与 WebAPI 在同一进程
- 不使用 Controller
- 使用 Minimal API + RequestDelegate
- 所有请求统一入口 → 动态分发
四、真正的"动态接口处理核心"(DI 驱动)
接口定义
csharp
public interface IRequestHandler
{
Task<IResult> HandleAsync(HttpContext context);
}
Mock 处理器(WebAPI 模拟器核心)
csharp
public class MockRequestHandler : IRequestHandler
{
private readonly ApiDefinitionStore _store;
public MockRequestHandler(ApiDefinitionStore store)
{
_store = store;
}
public async Task<IResult> HandleAsync(HttpContext ctx)
{
var path = ctx.Request.Path.Value;
var method = ctx.Request.Method;
var api = _store.Find(path, method);
if (api == null)
return Results.NotFound();
if (api.DelayMs > 0)
await Task.Delay(api.DelayMs);
var json = api.ResponseTemplate;
return Results.Text(json, "application/json");
}
}
五、Swagger 动态生成(关键技巧)
核心思想
Swagger 不支持"运行时新增 Endpoint"
但可以:
- 在启动时根据 ApiDefinition 生成 Endpoint
- 或通过 DocumentFilter / OperationFilter 动态生成描述
方案 A(推荐):启动时生成 Endpoint + Swagger
csharp
foreach (var api in store.All)
{
var builder = app.MapMethods(
api.Path,
new[] { api.HttpMethod },
async (HttpContext ctx, IRequestHandler handler) =>
{
return await handler.HandleAsync(ctx);
});
builder.WithOpenApi(op =>
{
op.Summary = api.Name;
op.Description = api.Description;
return op;
});
}
效果
- Swagger 页面自动显示 WPF 配置的接口
- 支持 GET / POST / PUT / DELETE
- 参数可继续扩展
方案 B:DocumentFilter(高级)
适合:
- 接口很多
- 不想真的 Map Endpoint
(可选,后续可展开)
六、WPF 动态更新接口(热更新策略)
方式 1(推荐)
- 修改配置
- 重启 WebAPI Host
- 速度极快(本地)
方式 2(高级)
- 使用
ApiDefinitionStore+ChangeToken - Handler 实时读取最新定义
- Swagger 仍需刷新
七、作为 WebAPI 模拟器,你已经具备的能力
✔ 模拟第三方 REST API
✔ 模拟 PLC / MES / SECS 接口
✔ 模拟异常 / 延迟 / 错误码
✔ 快速生成 Swagger 文档
✔ 不写 Controller
✔ 支持脚本 / 规则 / 代理
八、可扩展方向(如果你继续做产品)
- 参数占位符
json
{
"code": 0,
"lotId": "{{query.lotId}}"
}
- JS / C# Script 处理
- 录制真实 API → 回放
- 接口版本管理
- 接口分组(Swagger Tag)
- 权限 / Token 校验
九、总结一句话
这是一个"WPF 驱动的、DI 控制的、Swagger 可视化的、无 Controller 的 WebAPI 模拟器架构",非常适合你当前的使用场景。
如果你需要详细的实现可以私信我