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

