尝试通过SignalR发送消息时,客户端为空

5
我在我的MVC应用程序中有以下的中心枢纽,我想通过它向客户端代码发送一个简单的消息:
using SignalR.Hubs;  
    
public  class Progress : Hub
{
       public void Send(string message)
       {
            // Call the addMessage method on all clients
            Clients.addMessage(message);
       }
          
        public Progress()
        {
            Clients.addMessage("Starting to analyze image");
        }                 
}

下面是我视图中的javascript代码

<script src="/Scripts/jquery.signalR.js" type="text/javascript"></script>
<script src="/signalr/hubs" type="text/javascript"></script>

<script type="text/javascript">
    $(document).ready(function () {

        // Proxy created on the fly
        var connection = $.connection('/signalr/hubs/progress');

        // Declare a function on the chat hub so the server can invoke it
        connection.addMessage = function (message) {
            $('#messages').append('<li>' + message.Content + '</li>');
        };


        // Start the connection
        connection.start();
    });
</script>

我的问题是,当代码调用构造函数或发送方法时,Clients对象为null。

调试客户端代码时,一切看起来都很正常。/signalr/hubs/路由返回javascript代码,并且在运行javascript时没有错误。

我可以补充说明的是,后端代码运行在Umbraco 5 CMS环境之上,我不确定是否会引起任何干扰。

您有什么建议可以帮助我调试/解决这个问题吗?

1个回答

6
看起来你正在尝试通过实例化 hub 从服务器端代码广播消息。不幸的是,它不是这样工作的。你可以在这里查看如何从服务器端发送消息的示例:https://github.com/SignalR/SignalR/wiki/Hubs。请查看“Broadcasting over a Hub from outside of a Hub”部分。
以下内容将用于服务器端,用于进行广播。
using SignalR.Infrastructure;

string message = "Test Message";
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
clients.addMessage(message);

这与您的Send()方法相匹配,但如果您想设置进度指示器,则可能只想向调用者发送消息。在这种情况下,您需要将Progress方法更新为Caller.addMessage("Starting to analyze image");。如果要从Hub外部执行此操作,则需要更多技巧,因为您需要跟踪要更新的连接的客户端ID。一旦知道了上述更改内容,就变成了:

clients[clientId].addMessage(message);

1
请注意,AspNetHost已更改为GlobalHost(在SignalR.Hosting.Common中定义)。GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 对我有效。 - Kevin Pullin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接