При попытке отправить сообщение через signalR значение null - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть следующий концентратор в моем приложении 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 имеет значение null.

Все выглядит нормально, когда я отлаживаю код на стороне клиента./ Signalr / hubs / route возвращает код javascript, и при запуске javascript ошибок нет.

Могу добавить, что внутренний код выполняется поверх среды CMS Umbraco 5, что, я не уверен, вызываеткакие-либо помехи.

Любые предложения о том, как я могу отладить / решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

Звучит так, как будто вы пытаетесь передать сообщение из кода на стороне сервера, создав экземпляр концентратора. К сожалению, это не работает так. Вы можете увидеть пример того, как отправлять сообщения со стороны сервера, здесь: 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");. Выполнить это из-за пределов концентратора немного сложнее, так как вам нужно будет отслеживать идентификатор клиента для соединения, которое вы хотите обновить. Как только вы узнаете, что вышеизложенное меняется на:

clients[clientId].addMessage(message);
0 голосов
/ 20 февраля 2012

Вам нужно прочитать документы. Все в вашем образце выглядит неправильно. Начните здесь:

https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs

...