家庭网络上的SignalR

时间:2014-04-11 17:09:21

标签: c# javascript asp.net networking signalr

修改/摘要

经过大量的反复尝试后,Paul Kearney-pk帮助我找到答案,虽然我仍然不知道为什么这种情况发生,至少我知道如何得到它工作。

快速摘要:当我在工作时直接连接到我的网络时,客户端可以连接到笔记本电脑上的端口8080。当我在家庭网络上时,客户端无法连接到端口8080。为了解决这个问题,我创建了一个防火墙规则(在我的笔记本电脑上)以允许8080上的入站流量。我真的很想知道为什么会这样。我的笔记本电脑的Windows防火墙服务是否真的根据我连接的网络更改其设置?


注意:当我在网络上工作时,这一切都有效,但它不能在我的家庭网络或其他人的家庭网络上工作。主机(我的笔记本电脑)在两个位置都是相同的。

我有一个使用SignalR的网络应用。 当我在与运行SignalR主机的机器上运行Web应用程序时,一切正常。当我尝试从其他计算机连接时,出现此错误

> GET http://10.0.0.13:8080/signalr/hubs net::ERR_CONNECTION_TIMED_OUT. Cannot read property 'client' of undefined.

该错误来自我的index.html页面:

<script src="http://10.0.0.13:8080/signalr/hubs"></script>

根据我所做的研究,我知道我不应该在我的SignalR网址中使用localhost。所以我使用了星号。这是我自己托管的SignalR应用程序:

class Program
{
    static void Main(string[] args)
    {
        string url = "http://*:8080";
        using (WebApp.Start(url))
        {
            Console.WriteLine("Server running on {0}", url);
            Console.ReadLine();
        }
    }
}

class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}
public class RaceHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.addMessage(name, message);
    }
}

这是我连接的JavaScript:

  var signalRUrl = 'http://10.0.0.13:8080/signalr';

  $.connection.hub.url = signalRUrl;
  var hub = $.connection.raceHub;  // proxy reference to hub

  // Create a function that the hub can call to broadcast messages.
  hub.client.addMessage = function (name, message) {
      receiveSignalRMessage(name, message);
  };

  $.connection.hub.start();  // Start the connection.

就像我说的,这一切都在当地有效。但它并不适用于其他机器。我没有启用Windows防火墙,因此不是问题。有什么想法吗?

HTTPS无效。当我在网络上工作时,它可以工作,但不在家。配置是一样的。必须与我的家庭网络有关。

此外,这是页面工作正常时的样子:

enter image description here

这就是当它无法正常工作时发生的事情:

enter image description here

4 个答案:

答案 0 :(得分:3)

(完全披露 - @BobHorn根据我的评论输入了这个答案)

您的计算机上有不同的防火墙设置,具体取决于您所连接的网络类型。

您是否注意到第一次连接到新网络时,它会要求您将其定义为&#34;工作,私人,公共,家庭等等?&#34;

您为该网络选择的任何内容都是粘性的,并且当您使用该类型的网络时,将应用相关的防火墙策略。

要检查这一点,您可以完全关闭防火墙,也可以确保所有防火墙配置文件的入站端口8080都已打开,尤其是&#34; home&#34;网络和/或家庭&#34;防火墙配置文件。

啊..所以你说你的Windows防火墙是关闭的。您确定它不仅仅为WORK网络配置文件关闭,而是为HOME网络配置文件启用了吗?

要解决此问题,我会将wireshark放在其中一台试图连接到家中的端口8080的客户端计算机上,并查看它是如何/为何被阻止或无法连接。

您还可以尝试从家中的客户端计算机telnet到端口8080(如果启用了Telnet客户端功能)。如果端口打开并且连接成功,或者大胖子被拒绝,您将立即知道。快速简便的测试。从命令行键入TELNET ServerIPAddress PortNumber。如果未找到Telnet命令,则需要在Windows功能/组件中打开Telnet客户端。

答案 1 :(得分:0)

您的网络是否使用IP安全性?您可以尝试使用HTTPS来查看是否可以缓解任何问题。

答案 2 :(得分:0)

看起来您的工作网络阻止了您的IP。尝试在工作网络中将家庭IP列入白名单。

答案 3 :(得分:0)

我认为这里的问题是你的笔记本电脑的IP地址从一个网络(即工作)变为另一个网络(即家庭),但你可能不会相应地更新javascript文件中signalRUrl变量的值,因此您的应用程序的客户端正在寻找家庭网络上不存在的IP地址的集线器。

更改网络时,需要在javascript中更新signalRUrl的值,以反映主机的当前IP地址。