.NET 9 WinForms自托管Kestrel Web API实现问题求助
.NET 9 Windows Forms 自托管 Kestrel Web API 实现示例
1. 项目准备
- 创建**Windows Forms App (.NET 9)**项目
- 安装必要的NuGet包:
注意:不需要安装Install-Package Microsoft.AspNetCore Install-Package Microsoft.AspNetCore.Http.AbstractionsMicrosoft.AspNetCore.App,.NET 6+中框架依赖的ASP.NET Core组件已包含在SDK内,手动安装反而会引发冲突。
2. 核心代码实现
2.1 编写Web API服务配置类
在项目中新建ApiStartup.cs类:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; public class ApiStartup { public void Configure(IApplicationBuilder app) { // 启用路由功能 app.UseRouting(); // 配置API端点 app.UseEndpoints(endpoints => { // 示例GET接口:返回当前系统时间 endpoints.MapGet("/api/current-time", async context => { await context.Response.WriteAsync($"当前时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); }); // 示例POST接口:接收并返回提交内容 endpoints.MapPost("/api/echo", async context => { var requestContent = await new StreamReader(context.Request.Body).ReadToEndAsync(); await context.Response.WriteAsync($"你提交的内容:{requestContent}"); }); }); } }
2.2 在WinForms中托管Kestrel
修改主窗体Form1.cs代码:
using Microsoft.AspNetCore.Hosting; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; public partial class Form1 : Form { private IWebHost _webHost; public Form1() { InitializeComponent(); // 添加控制按钮 var btnStart = new Button { Text = "启动Web API", Location = new Point(20, 20), Size = new Size(120, 30) }; btnStart.Click += BtnStart_Click; this.Controls.Add(btnStart); var btnStop = new Button { Text = "停止Web API", Location = new Point(150, 20), Size = new Size(120, 30), Enabled = false }; btnStop.Click += BtnStop_Click; this.Controls.Add(btnStop); } private void BtnStart_Click(object sender, EventArgs e) { // 配置并启动Kestrel服务 _webHost = new WebHostBuilder() .UseKestrel() .UseStartup<ApiStartup>() .UseUrls("http://localhost:5000;https://localhost:5001") // 指定监听地址与端口 .Build(); // 后台线程启动服务,避免阻塞UI Task.Run(() => _webHost.Run()); ((Button)sender).Enabled = false; this.Controls.OfType<Button>().First(b => b.Text == "停止Web API").Enabled = true; MessageBox.Show("Web API服务已启动,可访问http://localhost:5000/api/current-time"); } private void BtnStop_Click(object sender, EventArgs e) { _webHost?.StopAsync().Wait(); _webHost?.Dispose(); ((Button)sender).Enabled = false; this.Controls.OfType<Button>().First(b => b.Text == "启动Web API").Enabled = true; MessageBox.Show("Web API服务已停止"); } protected override void OnFormClosing(FormClosingEventArgs e) { // 窗体关闭时自动释放服务资源 _webHost?.StopAsync().Wait(); _webHost?.Dispose(); base.OnFormClosing(e); } }
3. 运行验证
- 启动WinForms应用,点击「启动Web API」按钮
- 用浏览器或Postman测试接口:
- GET请求:
http://localhost:5000/api/current-time,返回当前系统时间 - POST请求:
http://localhost:5000/api/echo,提交任意内容后会原样返回
- GET请求:
- 点击「停止Web API」可终止服务,关闭窗体时服务也会自动停止
关键说明
- 不用
WebApplication的原因:WinForms项目模板未包含ASP.NET Core顶层语句与WebApplication初始化上下文,WebHostBuilder是更通用的自托管方式,兼容.NET 6到.NET 9全版本 - 必须在后台线程启动服务,否则会阻塞WinForms UI线程
- 窗体关闭时需释放WebHost资源,避免进程残留
内容的提问来源于stack exchange,提问作者ShamilS
相关产品推荐
相关产品推荐

