2

我正在使用 SignalR RC2,这是我的集线器

public class ImgHub : Hub
{
    public void Create(string guid)
    {
        Groups.Add(Context.ConnectionId, "foo");
    }

    public void SendMsg(string msg)
    {
        Clients.Group("foo").send(msg);
    }
}

我有一个控制台应用程序和一个连接到这个集线器的 web 应用程序(asp.net webforms)。控制台应用程序正如我所期望的那样工作,问题出在 Javascript 部分。当我在 SendMsg 中使用 Clients.Group 时,如果我将 SendMsg 更改为此,“发送”回调不会触发

public void ShareImage(byte[] image, string guid)
{
    Clients.All.ReceiveImage(image);
}

有用。这是Javascript代码

<script src="Scripts/jquery-1.7.1.min.js"></script>
<script src="Scripts/jquery.signalR-1.0.0-rc2.min.js"></script>
<script src="http://localhost:4341/signalr/hubs/" type="text/javascript"></script>
<script type="text/javascript">
    var mainHub;
    $(function () {
        $.connection.hub.url = 'http://localhost:4341/signalr';
        // Proxy created on the fly
        mainHub = $.connection.imgHub;

        mainHub.client.send = function (msg) {
            alert(msg);
        };

        // Start the connection
        $.connection.hub.start(function() {
            mainHub.server.create('vanuit den JS');
        })
            .done(function() {
                $('#msgButton').click(function() {
                    mainHub.server.sendMsg("msg from JS");
                });
            });
    });

</script>

正如您在 JS 代码中看到的那样,我在页面上还有一个调用 SendMsg 函数的按钮,消息确实到达了控制台应用程序,所以我猜想 JS 客户端已在 SignalR 组中正确注册。

我不是 JS 专家,所以我希望知道更多关于它的人可以帮助我。

4

2 回答 2

2

这是因为您需要在全局 asax 中启用重新加入组。

GlobalHost.HubPipeline.EnableAutoRejoiningGroups();

这里有更多详细信息: http ://weblogs.asp.net/davidfowler/archive/2012/11/11/microsoft-asp-net-signalr.aspx

此方法调用将在 1.0 RTM 中消失,但现在您需要这样做。

于 2013-01-19T18:55:10.813 回答
0

您的发送函数可能未执行的原因之一是,当您允许在客户端上调用 sendMsg 时,客户端可能尚未在组“foo”中。

在您的 $.connection.hub.start 中,您正在注册一个要在 start 完成时调用的函数,但是您还要注册另一个要在 start 完成后通过 .done 调用的函数。因此,发生的事情是两个函数几乎同时触发。因此,当 sendMsg 函数可供调用时,您可能尚未成功添加到组中。

以下是解决该问题的方法:

$.connection.hub.start().done(function() {
    mainHub.server.create('vanuit den JS').done(function() {
        $('#msgButton').click(function() {
            mainHub.server.sendMsg("msg from JS");
        });
    });
});

本质上,我一直在等待组加入成功完成,直到允许 sendMsg 通过。

我知道这是一个长期的答案,因为您可能在连接开始后等待了很长时间,但仍然没有任何东西通过电线,但我无法复制我的行为。

如果我上面的修复不起作用,您应该确保通过设置断点来调用您的服务器端函数。

于 2013-01-18T22:18:16.690 回答