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

基于C# .NET 4.0的服务作为客户端连接SignalR 1.2.2 Hub的技术问询

完整实现.NET 4.0 C#服务端作为SignalR 1.2.2 Hub客户端指南

看起来你已经搭好了基础框架,我来帮你补全所有必要环节,实现稳定的SignalR客户端连接功能。

第一步:安装核心依赖包

首先,确保你的WebSignalrClient项目已经安装了SignalR 1.2.2客户端包。打开NuGet包管理器,搜索并安装:

Install-Package Microsoft.AspNet.SignalR.Client -Version 1.2.2

或者直接在Package Manager Console执行上述命令,这是连接SignalR Hub的核心依赖。

第二步:完善WebSignalrClient类的完整实现

下面是补全后的WebSignalrClient代码,包含连接管理、服务器方法订阅、消息发送和异常处理逻辑:

using Microsoft.AspNet.SignalR.Client;
using System;
using System.Threading.Tasks;

public class WebSignalrClient
{
    // 连接配置属性
    public string HubUrl { get; set; }
    public string HubName { get; set; }
    
    // SignalR核心对象
    private HubConnection _hubConnection;
    private IHubProxy _hubProxy;
    // 标记连接状态,避免重复发起连接
    private bool _isConnected;

    public void InitialSignalrHub()
    {
        try
        {
            // 初始化Hub连接实例
            _hubConnection = new HubConnection(HubUrl);
            // 创建对应Hub的代理对象
            _hubProxy = _hubConnection.CreateHubProxy(HubName);

            // 订阅服务器端Hub定义的推送方法(示例:假设服务器有SendNotification方法向客户端推送消息)
            _hubProxy.On<string>("SendNotification", serverMessage =>
            {
                Console.WriteLine($"收到服务器通知: {serverMessage}");
                // 这里可以添加你的业务逻辑,比如写入日志、触发内部事件等
            });

            // 绑定连接状态变更和错误事件
            _hubConnection.StateChanged += Connection_StateChanged;
            _hubConnection.Error += Connection_Error;

            // 启动连接(.NET 4.0中需用Wait()处理异步操作,后台服务场景下无需担心死锁)
            var connectTask = _hubConnection.Start();
            connectTask.Wait();
            
            _isConnected = true;
            Console.WriteLine("SignalR Hub连接成功");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"连接SignalR Hub失败: {ex.Message}");
            _isConnected = false;
        }
    }

    // 封装向服务器发送消息的方法(示例:假设服务器有ReceiveClientMessage方法接收客户端消息)
    public void SendMessageToServer(string clientMessage)
    {
        if (!_isConnected || _hubProxy == null)
        {
            Console.WriteLine("未连接到SignalR Hub,无法发送消息");
            return;
        }

        try
        {
            // 调用服务器Hub方法,.NET 4.0中用Wait()等待操作完成
            _hubProxy.Invoke("ReceiveClientMessage", clientMessage).Wait();
            Console.WriteLine("消息已成功发送到服务器");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发送消息失败: {ex.Message}");
        }
    }

    // 连接状态变更处理逻辑
    private void Connection_StateChanged(StateChange stateChange)
    {
        Console.WriteLine($"连接状态更新: {stateChange.OldState} -> {stateChange.NewState}");
        if (stateChange.NewState == ConnectionState.Disconnected)
        {
            _isConnected = false;
            // 可选:添加自动重连机制,这里设置5秒后重试
            Task.Delay(5000).ContinueWith(_ => InitialSignalrHub());
        }
    }

    // 连接错误处理逻辑
    private void Connection_Error(Exception ex)
    {
        Console.WriteLine($"SignalR连接发生错误: {ex.Message}");
    }

    // 手动断开连接的方法,用于服务停止时清理资源
    public void Disconnect()
    {
        if (_hubConnection != null && _hubConnection.State == ConnectionState.Connected)
        {
            _hubConnection.Stop();
            _isConnected = false;
            Console.WriteLine("已主动断开SignalR Hub连接");
        }
    }
}

第三步:完善DLTransMonCore中的MonStart方法

在DLTransMonCore类中,需要确保WebSignalrClient实例的生命周期与服务一致,避免方法执行完毕后客户端被销毁:

public class DLTransMonCore
{
    // 保留客户端实例,确保服务运行期间连接持续有效
    private WebSignalrClient _signalrClient;

    public void MonStart()
    {
        _signalrClient = new WebSignalrClient();
        _signalrClient.HubUrl = "http://10.20.30.40/MyApp";
        _signalrClient.HubName = "MyAppHub";
        _signalrClient.InitialSignalrHub();

        // 示例:发送启动通知到服务器
        _signalrClient.SendMessageToServer("服务端客户端已启动");
    }

    // 可选:服务停止时调用,清理SignalR连接资源
    public void MonStop()
    {
        _signalrClient?.Disconnect();
    }
}

关键注意事项

  • 异步操作处理:.NET 4.0中SignalR的Start()和Invoke()均为异步方法,使用Wait()时,后台服务场景无需担心死锁,但如果在UI线程调用需额外处理上下文。
  • 连接稳定性:代码中添加了自动重连逻辑,连接断开后5秒尝试重新连接,你可以根据业务需求调整重试间隔。
  • 方法名称匹配:客户端订阅和调用的方法名称必须与服务器Hub中的方法名称完全一致(区分大小写)。
  • 异常捕获:所有网络操作都添加了异常处理,避免服务因连接错误直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:39