【WebAPI 模拟器】.NET 8/9 + Minimal API + Swagger + DI + WPF Host
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 配置的“接口定义”)
publicclassApiDefinition{publicstring Name {get;set;}publicstring Path {get;set;}// /api/testpublicstring HttpMethod {get;set;}// GET / POSTpublicstring Description {get;set;}publicstring RequestSchema {get;set;}// JSON Schema(可选)publicstring ResponseTemplate {get;set;}// JSON 模板publicint DelayMs {get;set;}// 模拟延迟publicstring HandlerType {get;set;}// Mock / Script / Proxy}WPF 只负责维护这份数据(内存、SQLite、JSON 均可)。
三、WPF 中启动 WebAPI(同进程)
publicclassWebApiHost{privateWebApplication _app;publicvoidStart(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;}privatevoidMapDynamicApis(WebApplication app){var store = app.Services.GetRequiredService<ApiDefinitionStore>(); app.Map("/{**path}",async(HttpContext ctx,IRequestHandler handler)=>{returnawait handler.HandleAsync(ctx);}).ExcludeFromDescription();// 避免吞掉 Swagger}}关键点
- WPF 与 WebAPI 在同一进程
- 不使用 Controller
- 使用 Minimal API + RequestDelegate
- 所有请求统一入口 → 动态分发
四、真正的“动态接口处理核心”(DI 驱动)
接口定义
publicinterfaceIRequestHandler{Task<IResult>HandleAsync(HttpContext context);}Mock 处理器(WebAPI 模拟器核心)
publicclassMockRequestHandler:IRequestHandler{privatereadonlyApiDefinitionStore _store;publicMockRequestHandler(ApiDefinitionStore store){ _store = store;}publicasyncTask<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
foreach(var api in store.All){var builder = app.MapMethods( api.Path,new[]{ api.HttpMethod },async(HttpContext ctx,IRequestHandler handler)=>{returnawait 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
✔ 支持脚本 / 规则 / 代理
八、可扩展方向(如果你继续做产品)
- 参数占位符
{"code":0,"lotId":"{{query.lotId}}"}- JS / C# Script 处理
- 录制真实 API → 回放
- 接口版本管理
- 接口分组(Swagger Tag)
- 权限 / Token 校验
九、总结一句话
这是一个“WPF 驱动的、DI 控制的、Swagger 可视化的、无 Controller 的 WebAPI 模拟器架构”,非常适合你当前的使用场景。
如果你需要详细的实现可以私信我