必须先调用SignalR控制台应用程序启动才能发送数据

Nul*_*nce 4 c# asp.net-mvc signalr

我正在尝试创建一个客户端信号器应用程序.目前,我能够让我的MVC客户端向Hub发送消息,但是,我的.NET客户端应用程序遇到了一些困难

服务器中心代码:

namespace ServerHub
{
    public class ChatterBox : Hub
    {

        public void Send(string message)
        {
            Clients.All.addMessage(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台应用程序代码(几乎直接从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");
                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在下面收到错误消息 connection.Send()

必须先调用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");
            }
        });


    myHub.Invoke("Send", "lol");
Run Code Online (Sandbox Code Playgroud)

仍然给我一个错误

编辑:第三次尝试

            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");
                }
            });
Run Code Online (Sandbox Code Playgroud)

似乎工作

我还需要设置端口号 - 例如,如果我正在浏览我的MVC网站:http://localhost:60610/这是我需要在我的控制台应用中设置的地址.

我可以说在部署期间,这不会是一个问题,因为它默认是端口80吗?

dav*_*owl 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 =>
            {
                 .......
            });
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果您可以使用.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");
Run Code Online (Sandbox Code Playgroud)

更新:让我们再试一次.下面的代码可以工作,但您应该阅读该链接以了解如何编写异步代码.否则你会一遍又一遍地遇到这些问题.

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");
        }
    });
Run Code Online (Sandbox Code Playgroud)