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

ASP.NET MVC控制器向SignalR Hub传递参数数据的问题解决指引

问题排查与修正方案

你的代码存在几处关键问题,导致控制器无法通过SignalR向客户端发送消息,以下是逐一修正步骤:

1. 客户端Hub连接名称不匹配

SignalR会自动将Hub类名转换为驼峰命名作为客户端连接对象名。你的Hub类名为SilgramHubs,客户端应使用$.connection.silgramHubs,而非chatHubs。

修正后的客户端脚本:

$(function () {
    // 匹配Hub类名的驼峰形式
    var hub = $.connection.silgramHubs;

    hub.client.addNewMessage = function (id, note) {
        console.log("Received message:", id, note);
    };

    $.connection.hub.start()
        .done(function () {
            console.log("SignalR hub connected");
        })
        .fail(function(error) {
            // 添加错误日志便于排查连接问题
            console.error("SignalR connection failed:", error);
        });
});

2. 控制器依赖注入失效

你保留了无参构造函数,导致DI容器无法注入IHubContext<SilgramHubs>,_hubContext会为null,调用时自然无反应。需移除无参构造函数,确保DI能正确注入。

修正后的控制器代码:

using testproject.Hubs; // 确保引用Hub的命名空间
using Microsoft.AspNet.SignalR;

public class SampleController : Controller
{
    private readonly IHubContext<SilgramHubs> _hubContext;

    // 仅保留带IHubContext的构造函数
    public SampleController(IHubContext<SilgramHubs> hubContext)
    {
        _hubContext = hubContext;
    }

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Save(long id = 0, string note = "")
    {
        NumberViewModel ml = new NumberViewModel { Iid = id, INote = note };
        return RedirectToAction("OneMessage", ml);
    }

    public ActionResult OneMessage(NumberViewModel ml)
    {
        var Iid = (int)ml.Iid;
        var Note = ml.INote;

        // 直接调用客户端注册的addNewMessage方法
        _hubContext.Clients.All.addNewMessage(Iid, Note);

        return PartialView(ml);
    }
}

3. Startup.cs配置错误

  • 重复调用app.MapSignalR()会导致路由冲突,需仅保留一次映射。
  • app.UseCors需放在MapSignalR之前,因为中间件执行顺序是从上到下,跨域处理需优先于SignalR路由。

修正后的Startup.cs代码:

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;
using Microsoft.Owin.Cors;

[assembly: OwinStartup(typeof(SadeMvc.Startup))]

namespace SadeMvc
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 先启用跨域支持,再映射SignalR
            app.UseCors(CorsOptions.AllowAll);

            // 仅保留一次SignalR映射(使用默认路由/signalr)
            app.MapSignalR();

            // 如需自定义路由,可替换为以下代码,不要同时使用两个MapSignalR
            // app.MapSignalR("/custom-signalr", new HubConfiguration
            // {
            //     EnableJSONP = true,
            //     EnableDetailedErrors = true
            // });
        }
    }
}

4. Hub代码优化

你的Hub中sendPartialViewHtmlToClients方法是供客户端调用的服务器端方法,控制器无需通过该方法转发消息,直接调用客户端注册的addNewMessage即可。若无需客户端调用该方法,可直接删除:

using Microsoft.AspNet.SignalR;

namespace testproject.Hubs
{
    public class SilgramHubs : Hub
    {
        // 若无需客户端调用此方法,可删除
        // public void sendPartialViewHtmlToClients(int id, string note)
        // {
        //     Clients.All.addNewMessage(id, note);
        // }
    }
}

额外注意事项

  • 确保客户端脚本引用顺序正确:先引用jQuery,再引用SignalR核心脚本,最后引用自动生成的代理脚本~/signalr/hubs:
    <script src="~/Scripts/jquery-3.6.0.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.4.3.min.js"></script>
    <script src="~/signalr/hubs"></script>
    
  • 检查项目中SignalR版本是否一致,避免版本不兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:14:56