如何让Blazor应用中的TCP Socket监听器永久运行不中断?
解决Blazor应用TCP Socket监听器随机断开问题(闲置触发)
针对你遇到的TCP Socket监听器因网站闲置频繁断开的问题,可通过以下几个层面的配置和代码优化解决:
1. 禁用IIS应用池闲置超时与回收
- 打开IIS管理器,定位到对应应用池,右键选择高级设置
- 将**闲置超时(分钟)**设为
0(表示永不触发闲置回收) - 把**定期时间间隔(分钟)**也设为
0,避免应用池定期重启 - 将启动模式改为
AlwaysRunning,强制IIS保持应用进程持续活跃
2. 关闭Plesk的网站闲置休眠设置
- 登录Plesk后台,进入目标网站的主机设置
- 在性能相关选项中,关闭“闲置时暂停网站”类的自动休眠开关
- 同步Plesk内的应用池配置,确保和IIS的
AlwaysRunning、超时设置一致
3. 给Blazor应用添加内部心跳机制
通过后台定时任务发起内部请求,阻止应用进入闲置状态:
public class KeepAliveService : IHostedService, IDisposable { private readonly IHttpClientFactory _httpClientFactory; private Timer _timer; public KeepAliveService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public Task StartAsync(CancellationToken cancellationToken) { // 每2分钟发起一次心跳请求 _timer = new Timer(DoHeartbeat, null, TimeSpan.Zero, TimeSpan.FromMinutes(2)); return Task.CompletedTask; } private void DoHeartbeat(object state) { var client = _httpClientFactory.CreateClient(); try { // 替换为你的应用内部API地址 client.GetAsync("https://your-app-domain/api/keep-alive").Wait(); } catch { /* 忽略心跳失败,避免干扰主程序 */ } } public Task StopAsync(CancellationToken cancellationToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } }
在Program.cs中注册服务:
builder.Services.AddHostedService<KeepAliveService>(); builder.Services.AddHttpClient();
4. 强化Socket监听器的异常重连逻辑
确保监听器在意外断开后自动恢复:
private async Task RunTcpListener(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { using var listener = new TcpListener(IPAddress.Any, 你的监听端口); listener.Start(); while (!cancellationToken.IsCancellationRequested) { var client = await listener.AcceptTcpClientAsync(cancellationToken); // 处理客户端连接逻辑 _ = HandleClientAsync(client, cancellationToken); } } catch (Exception ex) { // 记录异常日志 await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); } } }
内容的提问来源于stack exchange,提问作者Muhab
相关产品推荐
相关产品推荐

