0

我正在使用最新版本的 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!"); });

任何人都可以阐明可能发生的事情吗?谢谢大家!

4

1 回答 1

4

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

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

$.connection.hub.start();

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

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

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

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

于 2013-04-01T19:40:00.973 回答