SignalR自主连接问题

时间:2015-01-25 15:13:49

标签: signalr

我最近使用SignalR(自我主机)创建了一个概念验证控制台应用程序。它对我们的使用起了很大作用。客户端连接正常,我能够从服务器向客户端发送更新。可爱!

我现在已将代码从Console应用程序转移到winforms应用程序,以获得更漂亮的UI。现在相同的客户端将无法连接到服务器,但它仍将连接到旧的控制台版本。

Winforms代码:

string url = "http://localhost:8080";
            using (WebApp.Start(url))
            {
                // Let the app know the server is up
            }

控制台代码:

string url = "http://localhost:8080";
            using (WebApp.Start(url))
            {
                Console.WriteLine("Server running on {0}", url);
                Console.ReadLine();
            }

客户端连接代码:

if (!connected)
                {
                    int i = 0;

                    // Try 3 times
                    while (i <= 2)
                    {
                        try
                        {
                            string server = Properties.Settings.Default.Server + ":" + Properties.Settings.Default.PortNumber.ToString();
                            connection = new HubConnection(server);
                            connection.StateChanged += connection_StateChanged;

                            hub = connection.CreateHubProxy("MyHub");
                            connection.Start().Wait();

                            hub.On<string>("addMessage", param => { UpdateAlarmStatus(param); });
                            return true;
                        }
                        catch (Exception)
                        {
                            i++;
                        }
                    }
                    return false;
                }
                else
                {
                    return true;
                }

客户端报告的错误是: 异常:抛出:“由于目标机器主动拒绝它,因此无法建立连接”(System.Net.Sockets.SocketException) 抛出了System.Net.Sockets.SocketException:“由于目标机器主动拒绝它,因此无法建立连接” 时间:25/01/2015 15:09:23 线程:工作线程[8232]

为什么目标机器(localhost)拒绝自己哪个控制台版本没有?我一直在看代码,我无法看到我出错的地方。有人能指出我正确的方向吗?

感谢您的阅读。 保罗。

1 个答案:

答案 0 :(得分:0)

我怀疑这是机器/基础设施配置的问题,而不是代码本身,乍看之下看起来很好。

您是否检查过Visual Studio中的控制台调试输出?我最近遇到了类似症状的问题,这就是给我提供最新线索以继续调查的原因。在我的特定情况下,一个异常被写入控制台调试输出,但没有发送给客户端。

SignalR通常会自动与服务器协商以确定要使用的最佳传输方法。在.NET客户端中,可用选项是LongPollingTransport,ServerSentEventsTransport和WebSocketTransport。因此,出于某种原因,您的控制台应用程序可以使用这些方法中的至少一种,而您的WinForms客户端则不能。

您可以启用跟踪,以便为您提供更多信息。为此,请在创建集线器代理之前输入以下内容:

hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;