【WebAPI 模拟器】.NET 8/9 + Minimal API + Swagger + DI + WPF Host

【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
✔ 支持脚本 / 规则 / 代理


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

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

九、总结一句话

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

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

Read more

前端小白也能秒上手:JS生成UUID的10种姿势(附避坑指南)

前端小白也能秒上手:JS生成UUID的10种姿势(附避坑指南)

前端小白也能秒上手:JS生成UUID的10种姿势(附避坑指南) * 前端小白也能秒上手:JS生成UUID的10种姿势(附避坑指南) * 为啥前端突然要搞这破玩意儿?还不是被后端逼的 * 先整明白UUID到底是个啥,别瞎用 * 土法炼钢第一式:Math.random()真的靠谱吗? * 土法炼钢第二式:Date.now()加料版 * 土法炼钢第三式:浏览器指纹大杂烩 * 正规军来了:uuid npm包到底香不香? * 浏览器原生API:crypto.randomUUID()真香预警 * 生产环境翻车实录:那些我以为的唯一其实并不唯一 * 实战代码大放送:这些场景你肯定用得上 * 调试技巧:怎么验证你的UUID真的唯一? * 冷门但好用的小技巧 * 最后唠叨两句,也是掏心窝子的话 前端小白也能秒上手:JS生成UUID的10种姿势(附避坑指南) 说实话啊,这篇文章我原本是不想写的。真的,因为UUID这玩意儿听起来就挺"后端味儿"的,感觉应该是那帮穿格子衫的Java老哥在Spring Boot里@Genera

AI 直接生成前端代码:我的软件原型设计流,从此告别重复画图

AI 直接生成前端代码:我的软件原型设计流,从此告别重复画图

近年来,AI 辅助开发越来越成熟,尤其是在快速原型设计方面。今天分享一下我如何借助 Cursor、Trace solo、ChatGPT、Qoder 等 AI 工具,高效完成软件原型的自动绘制与代码生成。 📌 核心流程三步走 1️⃣ 用 AI 输出需求文档(非技术描述) 首先,我会让 AI 根据产品思路或功能描述,生成一份清晰、无技术细节的需求文档。这一步不写代码,只聚焦逻辑与用户流程。 2️⃣ AI 生成 HTML 原型代码 基于上一步的需求文档,直接让 AI 生成对应的 HTML 代码,快速搭建出可交互的前端原型。支持实时预览,直观看到界面效果。 3️⃣ 反复微调,直至满意 生成的原型往往需要多次调整。通过自然语言描述修改方向,AI 可快速迭代代码,直至达到想要的交互与视觉效果。

【红黑树进阶】手撕STL源码:从零封装RB-tree实现map和set

【红黑树进阶】手撕STL源码:从零封装RB-tree实现map和set

👇点击进入作者专栏: 《算法画解》 ✅ 《linux系统编程》✅ 《C++》 ✅ 文章目录 * 一. 源码及框架分析 * 1.1 STL源码中的设计思想 * 1.2 STL源码框架分析 * 二. 模拟实现map和set(实现复用红黑树的框架) * 2.1 红黑树节点的定义 * 2.2 红黑树的基本框架 * 2.3 解决Key的比较问题:KeyOfT仿函数 * 2.4 支持insert插入 * 2.5 map和set的insert封装 * 三. 迭代器的实现 * 3.1 迭代器结构设计 * 3.2 迭代器的++操作 * 3.3 迭代器的--操作 * 3.4 RBTree中的迭代器接口 * 四. map和set对迭代器的封装 * 4.

OCR增强与空间感知升级|Qwen3-VL-WEBUI在Dify中的实战应用

OCR增强与空间感知升级|Qwen3-VL-WEBUI在Dify中的实战应用 💡 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。 1. 引言:视觉智能的“低代码革命” 在企业数字化转型加速的今天,如何让AI真正“看懂世界”并快速落地到业务流程中,已成为技术团队的核心挑战。传统多模态系统开发周期长、依赖专业算法工程师、部署复杂——尤其在OCR识别、GUI理解、空间关系分析等任务中,往往需要定制化模型训练与大量工程适配。 而随着阿里通义千问发布 Qwen3-VL-WEBUI 镜像,这一局面正在被打破。该镜像内置了最新一代视觉语言模型 Qwen3-VL-4B-Instruct,不仅具备强大的图文理解能力,更在OCR鲁棒性、空间感知、GUI代理等方面实现全面升级。结合低代码平台 Dify,开发者无需编写任何后端代码,即可构建出具备“视觉认知+逻辑决策”能力的智能应用。 本文将深入解析 Qwen3-VL 的核心技术增强点,并通过实际案例展示其在 Dify