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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:35:08