【问题标题】:SignalR Broadcast from Controller not working来自控制器的 SignalR 广播不起作用
【发布时间】:2013-03-22 22:18:18
【问题描述】:

我使用的是最新版本的 SignalR (1.0.1)。我正在尝试从我的控制器向集线器广播,但遇到了一些问题:

  1. 我的客户似乎没有收到消息。
  2. 似乎我的中心上下文甚至没有定义“addMessage”:

我的中心:

public class SignalRPriceHub : Hub
{
    public void sndMessage(string msg)
    {
        Clients.All.addMessage(msg + "****");
    }
}

Javascript 客户端:

<script src="@Url.Content("~/Scripts/jquery.signalR-1.0.1.min.js")"></script>
<script src="~/signalr/hubs"></script>
.....
var myHub = $.connection.signalRPriceHub;
myHub.client.addMessage = function (message) {
    alert(message);
};

控制器:

var context = GlobalHost.ConnectionManager.GetHubContext<SignalRPriceHub>();
context.Clients.All.addMessage("TestOutsideMessage!!!");

我注意到了一些事情: 1. 我的中心上下文似乎没有“addMessage” {"'Microsoft.AspNet.SignalR.Hubs.ClientProxy' 不包含 'addMessage' 的定义"} System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

  1. 如果我从与上面的客户端代码相同的文件中运行以下代码,我会收到一条消息。

    var myHub = $.connection.signalRPriceHub; $.connection.hub.start(function () { myHub.server.sndMessage("Hello World!"); });

任何人都可以对可能发生的事情有所了解吗?谢谢大家!

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案1】:

    我将回顾您最初应用程序中的错误,这些错误阐明了为什么您的第二个要点可以使一切正常。

    在您的 javascript 客户端中,您必须启动连接:

    $.connection.hub.start();
    

    然后您必须通过调用 sndMessage 命令在集线器上请求消息:

    $.connection.hub.start().done(function() {
        myHub.server.sndMessage("Hello world");
    });
    

    在中心上下文中看不到 addMessage 函数的原因是中心上下文 .Clients.All 是动态的。

    最后一点,为了使示例工作,您还需要确保在 Application_Start 中有 RouteTable.Routes.MapHubs(); .我假设你已经有了这个,因为一旦你添加了连接开始一切正常。

    【讨论】:

    • 非常感谢您如此详细的回答。在没有真正考虑每一行代码的作用的情况下“通过动作”来设置这一切。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多