0

Windows Azure プロジェクトに SignalR を実装しました。Web ロールの Javascript/HTML クライアントとプロジェクトのコンソール アプリケーションの 2 つのクライアントがあります。Web ロールは私の SignalR サーバーです。Web ロールとコンソール アプリケーションをスタートアップ プロジェクトとして配置すると、HTML クライアントから送信したメッセージがコンソール アプリケーションに送信されます。しかし、Cloud プロジェクトとコンソール アプリケーションをスタートアップ プロジェクトとして配置すると、HTML クライアントからのメッセージがコンソール アプリケーションに送信されません。本当に奇妙です。問題を引き起こしている2つの違いが何であるかわかりません。

また、接続されたクライアントに定期的にメッセージを送信するバックグラウンド スレッドを Web ロールに配置すると、両方の場合に機能します。つまり、起動プロジェクトに関係なく、コンソール アプリと HTML クライアントがメッセージを受信して​​います。

何が問題なのかわかる方いましたら教えてください

私のハブ:

public class BroadcastHub : Hub
{
    public void Send(PersistedAudioRecord record)
    {
        // Call the BroadcastAudio method to update clients.
        Clients.All.BroadcastAudio(record);
    }
}

私の HTML/Javascript クライアント:

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

        // Declare a proxy to reference the hub. 
        var broadcast = $.connection.broadcastHub;
        // Create a function that the hub can call to broadcast messages.
        broadcast.client.broadcastAudio = function (record) {
            // Html encode user name, channel and  title. 
            var encodedName = $('<div />').text(record.Username).html();
            var encodedChannel = $('<div />').text(record.Channel).html();
            var encodedTitle = $('<div />').text(record.Title).html();
            // Add the broadcast to the page. 
            $('#broadcasts').append('<li><strong>' + encodedName
                + '</strong>:&nbsp;&nbsp;' + encodedChannel + '</strong>:&nbsp;&nbsp;' + encodedTitle + '</li>');
        };
        // Get the user name.
        $('#displayname').val(prompt('Enter your name:', ''));
        // Get the Channel name to which you want to broadcast.
        $('#channelname').val(prompt('Enter Channel:', ''));
        // Set initial focus to message input box.  
        $('#title').focus();
        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#sendbroadcast').click(function () {
                // Call the Send method on the hub. 
                var broadcastMessage = {}
                broadcastMessage.Username = $('#displayname').val();
                broadcastMessage.Channel = $('#channelname').val();
                broadcastMessage.Title = $('#title').val();
                broadcast.server.send(broadcastMessage);
                // Clear text box and reset focus for next broadcast. 
                $('#title').val('').focus();
            });
        });
    });
</script>

マイ コンソール アプリ クライアント:

class Program
{
    static void Main(string[] args)
    {
        HubConnection connection = new HubConnection("http://localhost:35540/");
        IHubProxy proxy = connection.CreateHubProxy("BroadcastHub");
        proxy.On<AudioRecord>("BroadcastAudio", BroadcastAudio);

        connection.Start().Wait();

        Console.ReadLine();
    }

    static void BroadcastAudio(AudioRecord record)
    {
        Console.WriteLine("Broadcast: {0} {1} {2}", record.Username, record.Channel, record.Title);
    }
}

背景スレッド:

public class BackgroundThread
{
    private static Random _random = new Random();

    public static void Start()
    {
        ThreadPool.QueueUserWorkItem(_ =>
        {
            IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<BroadcastHub>();

            while (true)
            {
                PersistedAudioRecord record = new PersistedAudioRecord();                    
                record.Channel = _random.Next(10).ToString();
                record.Username = new string('a', Convert.ToInt32(record.Channel));
                record.Title = new string('b', Convert.ToInt32(record.Channel));

                try
                {
                    hubContext.Clients.All.BroadcastAudio(record);
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.TraceError("SignalR error thrown: {0}", ex);
                }
                Thread.Sleep(TimeSpan.FromSeconds(2));
            }
        });
    }
}
4

1 に答える 1

0

このシナリオを自分のアプリケーションで試してみたところ、Webrole からコンソール アプリケーションにメッセージを送信できました。プロジェクトを圧縮して送信して、これが再現されるかどうかを確認することは可能ですか...

于 2013-02-05T00:47:33.800 に答える