我最近使用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)拒绝自己哪个控制台版本没有?我一直在看代码,我无法看到我出错的地方。有人能指出我正确的方向吗?
感谢您的阅读。 保罗。
答案 0 :(得分:0)
我怀疑这是机器/基础设施配置的问题,而不是代码本身,乍看之下看起来很好。
您是否检查过Visual Studio中的控制台调试输出?我最近遇到了类似症状的问题,这就是给我提供最新线索以继续调查的原因。在我的特定情况下,一个异常被写入控制台调试输出,但没有发送给客户端。
SignalR通常会自动与服务器协商以确定要使用的最佳传输方法。在.NET客户端中,可用选项是LongPollingTransport,ServerSentEventsTransport和WebSocketTransport。因此,出于某种原因,您的控制台应用程序可以使用这些方法中的至少一种,而您的WinForms客户端则不能。
您可以启用跟踪,以便为您提供更多信息。为此,请在创建集线器代理之前输入以下内容:
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;