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
相关产品推荐
相关产品推荐

