【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 模拟器架构",非常适合你当前的使用场景。


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

相关推荐
Zhen (Evan) Wang3 小时前
WPF基于MVVM实现自定义分页控件
wpf
柒.梧.4 小时前
MyBatis一对多嵌套查询实战:SQL99式与分布式查询双视角解析
wpf
AI题库4 小时前
NopCommerce 4.9.3开发实战 1.2 开发环境搭建指南(.NET 9+ & Visual Studio 2022)
ide·microsoft·.net·visual studio
我是唐青枫12 小时前
C#.NET 索引器完全解析:语法、场景与最佳实践
c#·.net
追逐时光者13 小时前
一款基于 .NET 9 构建的企业级 Web RBAC 快速开发框架
.net
幌才_loong18 小时前
深入解析 C# async/await 执行原理:从语法糖到状态机
后端·.net
Caco.D20 小时前
Aneiang.Pa 代理池(Proxy Pool)功能与 ASP.NET Core Web API 集成实战
爬虫·asp.net·.net·aneiang.pa
步步为营DotNet1 天前
深度解析.NET中HttpClient的连接管理机制:优化网络请求性能
网络·.net
温暖的苹果1 天前
【.Net runtime】corehost(.NET 应用启动过程)
c#·.net·.netcore