4

クライアントシグナルアプリを作成しようとしています。現在、MVCクライアントにハブとの間でメッセージを送受信させることはできますが、.NETクライアントアプリでいくつかの問題に直面しています。

サーバーハブコード:

namespace ServerHub
{
    public class ChatterBox : Hub
    {

        public void Send(string message)
        {
            Clients.All.addMessage(message);
        }
    }
}

コンソールアプリコード(ほとんど直接githubから削除されました)

using Microsoft.AspNet.SignalR.Client.Hubs;
using ServerHub;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
          Say("hello from console");
        }
        public static void Say(string message)
        {
            //var connection = new HubConnection("http://localhost/");

            //IHubProxy myHub = connection.CreateHubProxy("ChatterBox");

            var connection = new HubConnection("http://localhost/");
            //Make proxy to hub based on hub name on server
            var myHub = connection.CreateHubProxy("ChatterBox");
            //Start connection
            connection.Start().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    Console.WriteLine("Failed to start: {0}", task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine("Success! Connected with client connection id {0}", connection.ConnectionId);
                    // Do more stuff here
                }
            });

            connection.Send("Hello").ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    Console.WriteLine("Send failed {0}", task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine("Success");
                }
            });
        }
    }
}

中に、以下のエラーメッセージが表示されますconnection.Send()

データを送信する前に、Startを呼び出す必要があります。

どこで私は間違えましたか?

編集:

2回目の試行:

    var connection = new HubConnection("http://localhost/");
    //Make proxy to hub based on hub name on server
    var myHub = connection.CreateHubProxy("ChatterBox");
    //Start connection
    connection.Start().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                Console.WriteLine("Failed to start: {0}", task.Exception.GetBaseException());
            }
            else
            {
                Console.WriteLine("Success! Connected with client connection id {0}",
                                  connection.ConnectionId);

                // Do more stuff here

                connection.Send("Hello");
            }
        });


    myHub.Invoke("Send", "lol");

それでもエラーが発生します

編集:3回目の試行

            var connection = new HubConnection("http://localhost:60610/");
            //Make proxy to hub based on hub name on server
            var myHub = connection.CreateHubProxy("ChatterBox");
            //Start connection
            connection.Start().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    Console.WriteLine("Failed to start: {0}", task.Exception.GetBaseException());
                }
                else
                {
                    //Console.WriteLine("Success! Connected with client connection id {0}", connection.ConnectionId);

                    myHub.Invoke("Send", "lol");
                }
            });

動作しているようです

また、ポート番号を設定する必要がありました。たとえば、MVC Webサイトを次のように閲覧している場合http://localhost:60610/、これはコンソールアプリで設定する必要のあるアドレスです。

デフォルトではポート80になるため、展開中は問題にならないということはできますか?

4

1 に答える 1

5

これを読んでください http://msdn.microsoft.com/en-us/library/dd460717.aspx

TL;DR Start は非同期であり、順次非同期コードを記述する方法ではありません。

    var connection = new HubConnection("http://localhost/");
    //Make proxy to hub based on hub name on server
    var myHub = connection.CreateHubProxy("ChatterBox");
    //Start connection
    connection.Start().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Console.WriteLine("Failed to start: {0}", task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Success! Connected with client connection id {0}", connection.ConnectionId);

            // Do more stuff here

            connection.Send("Hello").ContinueWith(task =>
            {
                 .......
            });
        }
    });

.NET 4.5 を使用できる場合は、作業が大幅に楽になります。

var connection = new HubConnection("http://localhost/");
//Make proxy to hub based on hub name on server
var myHub = connection.CreateHubProxy("ChatterBox");
//Start connection
try 
{
    await connection.Start();
    Console.WriteLine("Success! Connected with client connection id {0}", connection.ConnectionId);
}
catch(Exception ex) 
{
    Console.WriteLine("Failed to start: {0}", ex.GetBaseException());
}

await connection.Send("Hello");

更新: これをもう一度試してみましょう。以下のコードは機能しますが、非同期コードの書き方を学ぶには、そのリンクを実際に読む必要があります。そうしないと、これらの問題に何度も遭遇することになります。

var connection = new HubConnection("http://localhost/");
//Make proxy to hub based on hub name on server
var myHub = connection.CreateHubProxy("ChatterBox");
//Start connection
connection.Start().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Console.WriteLine("Failed to start: {0}", task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Success! Connected with client connection id {0}",
                              connection.ConnectionId);

            myHub.Invoke("Send", "lol");
        }
    });
于 2012-11-30T10:26:42.030 に答える