【问题标题】:Clients is null when trying to send message via signalR尝试通过 signalR 发送消息时,客户端为空
【发布时间】:2012-03-10 04:29:18
【问题描述】:

我的 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>

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

调试客户端代码时一切正常。 /signalr/hubs/ 路由返回javascript代码,运行javascript时没有错误。

我可以补充一点,后端代码在 Umbraco 5 CMS 环境之上运行,我不确定这是否会造成任何干扰。

关于如何调试/解决此问题的任何建议?

【问题讨论】:

    标签: javascript model-view-controller umbraco signalr


    【解决方案1】:

    听起来您正试图通过实例化集线器从服务器端代码广播消息。不幸的是,它不是那样工作的。您可以在此处查看如何从服务器端发送消息的示例:https://github.com/SignalR/SignalR/wiki/Hubs。请查看“从集线器外部通过集线器进行广播”部分。

    以下内容将用于您要从中进行广播的服务器端

    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");。从集线器外部执行此操作有点棘手,因为您需要跟踪要更新的连接的客户端 ID。一旦您知道上述更改为:

    clients[clientId].addMessage(message);
    

    【讨论】:

    • 请注意,AspNetHost 已更改为 GlobalHost(在 SignalR.Hosting.Common 中定义)。 GlobalHost.ConnectionManager.GetHubContext();为我工作。
    猜你喜欢
    • 2022-10-22
    • 2015-03-03
    • 2016-09-19
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2020-08-13
    • 2023-03-11
    • 2020-12-16
    相关资源
    最近更新 更多