lWPF应用程序内部集成Web API和Swagger-UI
1. 选择自托管框架
Option 1:使用Kestrel(.NET 6+)
- 安装包:
Microsoft.AspNetCore.Server.Kestrel.Core
Swashbuckle.AspNetCore (Swagger支持)
- 创建Web宿主:
在WPF项目中添加 WebApplication 实例,示例:
private WebApplication _webApp;
// 启动API(在WPF窗口加载事件中)
private void StartWebApi()
{
var builder = WebApplication.CreateBuilder(new string[] { });
builder.WebHost.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 5000); // 监听本地端口
});
// 配置Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
// 添加API端点(示例)
app.MapGet("/weatherforecast", () =>
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
});
});
_webApp = app;
_ = app.RunAsync(); // 异步运行(避免阻塞UI线程)
}
// 停止API
private async void StopWebApi()
{
if (_webApp != null)
{
await _webApp.StopAsync();
}
}
2. 处理WPF线程问题
- 避免UI阻塞:
使用 async/await 或 Task.Run 启动/停止Web宿主,确保不阻塞UI线程。
- 跨线程访问:
若需在API中操作WPF控件,通过 Dispatcher 同步回UI线程:
app.MapGet("/updateui", () =>
{
Application.Current.Dispatcher.Invoke(() =>
{
// 更新WPF界面元素(如文本框、列表等)
});
return "UI updated";
});
3. 嵌入Swagger-UI到WPF
Option 1:使用WebView2控件
- 安装包:
Microsoft.Web.WebView2
- XAML中添加控件:
<Grid>
<WebView2 x:Name="swaggerWebView" />
</Grid>
- 加载Swagger页面:
在Web宿主启动后,通过 WebView2 加载本地地址:
swaggerWebView.Source = new Uri("http://localhost:5000/swagger");
4. 完整示例流程
1. 启动WPF应用,调用 StartWebApi() 初始化自托管API。
2. Swagger-UI通过WebView2显示,地址为 http://localhost:5000/swagger 。
3. API与WPF共享数据:
- API可访问WPF应用的业务逻辑或数据模型。
- 通过 Dispatcher 实现API对UI的更新。
注意事项
- 端口冲突:确保监听端口未被占用(如5000)。
- 性能影响:自托管API会增加WPF进程资源消耗,避免高并发场景。
- 安全限制:仅用于本地调试,生产环境需通过反向代理部署独立API服务。
如需更复杂的交互(如认证、动态路由),可结合 Autofac 等依赖注入框架优化架构。