You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.Abstractions
    
    注意:不需要安装Microsoft.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,提交任意内容后会原样返回
  • 点击「停止Web API」可终止服务,关闭窗体时服务也会自动停止

关键说明

  • 不用WebApplication的原因:WinForms项目模板未包含ASP.NET Core顶层语句与WebApplication初始化上下文,WebHostBuilder是更通用的自托管方式,兼容.NET 6到.NET 9全版本
  • 必须在后台线程启动服务,否则会阻塞WinForms UI线程
  • 窗体关闭时需释放WebHost资源,避免进程残留

内容的提问来源于stack exchange,提问作者ShamilS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:01:05