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

求C# SignalR强类型调用示例:C#客户端、无JS、含API调用Hub入口

C# SignalR 强类型调用完整示例

本示例完全匹配需求:

  • 基于强类型Hub实现客户端方法调用,无硬编码字符串参数
  • 客户端全C#实现,无JavaScript依赖
  • 提供API控制器端点,支持外部触发Hub逻辑

1. 前置依赖

服务端需要安装的NuGet包

  • Microsoft.AspNetCore.SignalR
  • Microsoft.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();
    }
}

测试流程

  1. 启动服务端,默认监听5000端口
  2. 启动客户端,控制台会打印系统推送的连接成功通知
  3. 调用POST接口 http://localhost:5000/api/notification/broadcast?sender=管理员&content=测试广播,所有在线客户端都会收到对应推送消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:18:03