求C# SignalR强类型调用示例:C#客户端、无JS、含API调用Hub入口
C# SignalR 强类型调用完整示例
本示例完全匹配需求:
- 基于强类型Hub实现客户端方法调用,无硬编码字符串参数
- 客户端全C#实现,无JavaScript依赖
- 提供API控制器端点,支持外部触发Hub逻辑
1. 前置依赖
服务端需要安装的NuGet包
Microsoft.AspNetCore.SignalRMicrosoft.AspNetCore.Mvc.Core
客户端需要安装的NuGet包
Microsoft.AspNetCore.SignalR.Client
2. 定义强类型客户端契约(服务端、客户端共用)
该接口是强类型调用的核心,服务端通过接口方法调用客户端,编译期即可校验参数和方法名正确性:
/// <summary> /// 客户端可被调用的方法契约 /// </summary> public interface INotificationClient { /// <summary> /// 接收消息通知 /// </summary> Task ReceiveMessage(string sender, string content); }
注意:接口方法签名需与客户端实现完全一致,SignalR会自动匹配
3. 服务端Hub实现
Hub继承泛型Hub<T>即可获得强类型的客户端调用能力,无需传递字符串方法名:
public class NotificationHub : Hub<INotificationClient> { public override async Task OnConnectedAsync() { // 强类型调用当前连接的客户端方法 await Clients.Caller.ReceiveMessage("系统", "服务端连接成功"); await base.OnConnectedAsync(); } }
4. 服务端启动配置(Program.cs)
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务 builder.Services.AddControllers(); // 注册强类型SignalR服务 builder.Services.AddSignalR(); var app = builder.Build(); // 映射Hub访问路由 app.MapHub<NotificationHub>("/hubs/notification"); // 映射API控制器路由 app.MapControllers(); app.Run();
5. 对外API控制器实现
注入泛型IHubContext<THub, TClient>即可在Hub外部调用客户端方法,支持外部系统触发推送逻辑:
[ApiController] [Route("api/[controller]")] public class NotificationController : ControllerBase { private readonly IHubContext<NotificationHub, INotificationClient> _hubContext; public NotificationController(IHubContext<NotificationHub, INotificationClient> hubContext) { _hubContext = hubContext; } /// <summary> /// 对外暴露的广播接口,调用后给所有在线客户端推送消息 /// </summary> [HttpPost("broadcast")] public async Task<IActionResult> Broadcast([FromQuery] string sender, [FromQuery] string content) { // 强类型调用所有在线客户端的接收方法 await _hubContext.Clients.All.ReceiveMessage(sender, content); return Ok("消息推送完成"); } }
6. C#客户端实现
完全基于C#开发,无任何前端依赖:
class Program { static async Task Main(string[] args) { // 构建Hub连接,替换为自己的服务端地址 var connection = new HubConnectionBuilder() .WithUrl("http://localhost:5000/hubs/notification") .Build(); // 绑定服务端调用的客户端方法,通过nameof避免硬编码字符串 connection.On<string, string>( nameof(INotificationClient.ReceiveMessage), (sender, content) => { Console.WriteLine($"收到来自【{sender}】的消息:{content}"); return Task.CompletedTask; }); // 启动连接 await connection.StartAsync(); Console.WriteLine("客户端已启动,按任意键退出"); Console.ReadKey(); await connection.StopAsync(); } }
测试流程
- 启动服务端,默认监听5000端口
- 启动客户端,控制台会打印系统推送的连接成功通知
- 调用POST接口
http://localhost:5000/api/notification/broadcast?sender=管理员&content=测试广播,所有在线客户端都会收到对应推送消息
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

