如何从SignalR中心接收主题消息?

时间:2014-05-26 17:32:04

标签: c# azure signalr

我已成功创建了一个Azure应用程序,可将DbTransactions发送到ServiceBus Queue,然后将“{0}”通知消息排入队列。到ServiceBus Topic以便其他客户监控(......这样他们就可以自动接收更新)。

现在,我想使用SignalR来监控&收到SubscriptionClient消息...我的测试代码在其'上运行正常。自己的。

我找到了许多将消息发送到Azure队列的示例(这很简单)。而且,我有代码从BrokeredMessage收到SubscriptionClient。但是,我无法让SignalR继续监控我的Distribute方法。

如何让SignalR监控Topic

背后的代码:(已更新)

    public void Dequeue()
    {
        SubscriptionClient subscription = GetTopicSubscriptionClient(TOPIC_NAME, SUBSCRIPTION_NAME);

        subscription.Receive();

        BrokeredMessage message = subscription.Receive();

        if (message != null)
        {
            try
            {
                var body = message.GetBody<string>();
                var contextXml = message.Properties[PROPERTIES_CONTEXT_XML].ToString();
                var transaction = message.Properties[PROPERTIES_TRANSACTION_TYPE].ToString();

                Console.WriteLine("Body: " + body);
                Console.WriteLine("MessageID: " + message.MessageId);
                Console.WriteLine("Custom Property [Transaction]: " + transaction);

                var context = XmlSerializer.Deserialize<Person>(contextXml);

                message.Complete();

                Clients.All.distribute(context, transaction);
            }
            catch (Exception ex)
            {
                // Manage later
            }
        }
    }

客户端代码:

    // TEST: Hub - GridUpdaterHub
    var hubConnection = $.hubConnection();
    var gridUpdaterHubProxy = hubConnection.createHubProxy('gridUpdaterHub');

    gridUpdaterHubProxy.on('hello', function (message) {
        console.log(message);
    });

    // I want this automated
    gridUpdaterHubProxy.on('distribute', function (context, transaction) {
        console.log('It is working');
    });

    connection.start().done(function () {

        // This is successful
        gridUpdaterHubProxy.invoke('hello', "Hello");
    });

1 个答案:

答案 0 :(得分:0)

我不会那样做。您的代码正在消耗并保留每个传入连接的ASP.NET线程池的线程,因此如果您有许多客户端,则根本无法正常扩展。我不太了解SignalR的内部结构,但我猜你的永无止境的方法是阻止SignalR让客户端调用你的回调,因为这需要服务器方法正确结束。只是尝试更改while(true)以及之后退出的内容,比如队列中的3条消息,你应该回叫3次,当你的方法退出时,这些调用可能会一起发生。

如果这是正确的,那么你可以转向不同的东西,比如将一个特定的线程专用于使用队列并从那里调用回调来GlobalHost.ConnectionManager.GetHubContext。可能更好,您可以尝试使用不同的进程来使用队列并对您的Web应用程序执行HTTP POST,然后将其广播到客户端。

相关问题