【问题标题】:SignalR on Home Network家庭网络上的 SignalR
【发布时间】:2024-04-16 19:25:02
【问题描述】:

编辑/摘要

经过大量的尝试和错误,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 URL 中使用 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 不起作用。当我在工作中使用网络时它可以工作,但在家里却不行。配置是一样的。一定和我的家庭网络有关。

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

当它不工作时会发生这种情况:

【问题讨论】:

  • 不是由 SignalR API 引起的,我不知道没有看到机器信息,但它可能是由 IP 版本引起的。你能证明 IP 版本吗?
  • IP 版本是什么意思? IPv4和IPv6?证明它们意味着什么?只是它们都是 IPv4 还是 IPv6?
  • 我实际上想说错误不是由 SignalR 引起的,很可能是由网络引起的。可以尝试用加号代替星号。
  • 对于否决这个问题的人,留下一些解释会有所帮助,以便 SO 像预期的那样运作,一个知识库......如果你不留下反馈,OP 如何改进对改善 SO 用户的问题?白痴。
  • 当您从工作单位搬到家中时,您是否在 javascript 中更新 signalRUrl 的值?我非常怀疑您的笔记本电脑的 IP 地址在两个位置是否相同。

标签: c# javascript asp.net networking signalr


【解决方案1】:

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

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

您有没有注意到,当您第一次连接到一个新网络时,它会要求您将其定义为“工作、私人、公共、家庭等”?

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • HTTPS 不起作用。当我在工作中使用网络时它可以工作,但在家里却不行。配置是一样的。一定和我的家庭网络有关。
    • 服务器用来接收请求的组件是基于 HTTPListener - 你可以检查你正在使用的 URL 与该类的文档:msdn.microsoft.com/en-us/library/vstudio/…
    【解决方案3】:

    您的工作网络似乎阻止了您的 IP。尝试将工作网络上的家庭 IP 列入白名单。

    【讨论】:

    • 如果这是真的,那么客户端计算机一开始就无法打开网页。
    • 您确定 siganlR 连接与网页是同一台服务器吗?它们可能不同。
    【解决方案4】:

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

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

    【讨论】:

    • 我在切换网络时正在更新 IP 地址,所以这不是问题。
    最近更新 更多