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

ASP.NET Core WebApi如何注入自定义WinForms日志记录器到Program类

实现方案

1. 修改WebApi项目Program类

在Program类中新增UI日志配置属性,完善ConfigureLogging代码块,完整代码如下:

public class Program
{
    public IHost ApiHost { get; private set; }
    public Task ServerTask { get; private set; }
    // 新增:暴露配置属性,供WinForms端传入日志控件参数
    public UILoggerOptions UiLoggerOptions { get; set; }

    public async Task Main(string[] args, CancellationToken token)
    {
        ApiHost = CreateHostBuilder(args).Build();
        ServerTask = ApiHost.RunAsync(token);
        await ServerTask;
    }

    public IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .ConfigureLogging(loggingBuilder =>
            {
                // 可选:如果不需要默认的控制台、调试日志,取消下一行注释
                // loggingBuilder.ClearProviders();
                
                // 注册自定义UI日志提供器
                loggingBuilder.AddProvider(new UILoggerProvider(UiLoggerOptions));
                
                // 按需配置最低日志输出级别
                loggingBuilder.SetMinimumLevel(LogLevel.Information);
            });
}

2. WinForms端绑定日志控件并启动WebApi

在WinForms启动WebApi的位置,将你的RichTextBox控件传入Program的配置中,示例代码(主窗口加载事件为例):

// 窗口全局声明取消令牌源,用于窗口关闭时停止WebApi
private CancellationTokenSource _apiCts;

private async void MainForm_Load(object sender, EventArgs e)
{
    _apiCts = new CancellationTokenSource();
    var apiProgram = new Program();
    // 绑定日志输出控件
    apiProgram.UiLoggerOptions = new UILoggerOptions
    {
        LogControl = richTextBox1 // 替换为你自己的RichTextBox控件名
    };
    // 后台启动WebApi,不会阻塞UI线程
    _ = apiProgram.Main(Array.Empty<string>(), _apiCts.Token);
}

// 窗口关闭时停止WebApi
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    _apiCts?.Cancel();
}

3. 可选优化(建议修改)

你现有的UILogger输出日志时可以新增换行,同时限制RichTextBox最大行数避免内存占用过高,修改Log方法中的AppendText逻辑:

ctl.Invoke((MethodInvoker)(() =>
{
    // 新增换行
    ctl.AppendText(logRecord + Environment.NewLine);
    // 限制最大1000行,超过则删除最早的200行,按需调整数值
    if (ctl.Lines.Length > 1000)
    {
        var newLines = ctl.Lines.Skip(200).ToArray();
        ctl.Lines = newLines;
        // 光标滚动到最后一行
        ctl.SelectionStart = ctl.TextLength;
        ctl.ScrollToCaret();
    }
}));

注意:你现有的UILogger已经用Invoke处理了跨线程控件访问,符合WinForms的线程安全要求,不需要额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:03