【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 配置的"接口定义")

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

✔ 支持脚本 / 规则 / 代理


八、可扩展方向(如果你继续做产品)

  1. 参数占位符
json 复制代码
{
  "code": 0,
  "lotId": "{{query.lotId}}"
}
  1. JS / C# Script 处理
  2. 录制真实 API → 回放
  3. 接口版本管理
  4. 接口分组(Swagger Tag)
  5. 权限 / Token 校验

九、总结一句话

这是一个"WPF 驱动的、DI 控制的、Swagger 可视化的、无 Controller 的 WebAPI 模拟器架构",非常适合你当前的使用场景。


如果你需要详细的实现可以私信我

相关推荐
键盘帽子5 小时前
长连接中异步任务的同步等待陷阱:一次主线程阻塞的排查与修复
java·websocket·java-ee·web
波波0076 小时前
每日一题:中间件是如何工作的?
中间件·.net·面试题
索荣荣6 小时前
Web基石:Java Servlet 全面指南:从基础原理到 Spring Boot 实战
java·springboot·web
无风听海7 小时前
.NET 10之可空引用类型
数据结构·.net
就是有点傻8 小时前
WPF按钮走马灯效果
wpf
zuozewei8 小时前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造8 小时前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造8 小时前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf
码云数智-园园8 小时前
基于 JSON 配置的 .NET 桌面应用自动更新实现指南
.net
无风听海8 小时前
.NET 10 之dotnet run的功能
.net