【问题标题】:SignalR Connect Returns 504SignalR 连接返回 504
【发布时间】:2014-06-19 00:15:45
【问题描述】:

我的 SignalR 出现了一个奇怪的行为,我有一个这样定义的集线器:

public class NotificationHub : Hub
{
     //Empty
}

在我的 js 中,我有以下内容:

function blabla {
    // bla bla

    $.connection.NotificationHub.client.AppendNewStory = function (story) {

        // appends a new story, long jquery code
    };

    $.connection.hub.start().done(function () {
         _ConnectionStarted = true; // there must be some built in way  
    });
}

我从我的 mvc 项目的一个类中调用 js

public SomeClass
{
    private IHubContext _context;

    public SomeClass()
    {
        _context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    }

    public void Notify(SomeData ...)
    {
        _context.Clients.User(userId).AppendNewStory(data);
    }
}

问题有两个症状:

  1. 服务器到客户端类间歇性失败(无法确定场景)。
  2. 我的网络服务器似乎变得非常缓慢,随后的 ajax 调用和常规的网络请求超时。

使用提琴手我发现了以下内容:

  1. SignalR/hubs 调用成功。
  2. SignalR 协商呼叫成功。
  3. 使用 WebSockets 传输连接失败,HTTP 504!
  4. 随后的连接调用尝试使用 foreverFrame 和长轮询,均以 200 成功。
  5. 发出一个轮询请求并且永不返回!之后,一切都变得缓慢或挂起。

如果我打开 2 个或更多选项卡,服务器会挂起,这可能有助于调试。一个标签似乎没问题。

我也在使用 IE 11 和 chrome,除了 chrome 尝试使用 serverSentEvents 而不是 foreverFrame 之外,同样的问题。

关于如何调试此问题的任何想法,看看为什么我得到 504?或者为什么服务器挂起?我有 Windows 8.1 Update 1、IIS 8、SignalR 2.0、.NET 4.5.1。

【问题讨论】:

    标签: signalr


    【解决方案1】:

    您是否在 Windows 8.1 中安装了 WebSockets?在添加/删除功能下执行此操作。在我这样做之前,我遇到了类似的随机连接问题。我还必须在 web.config 中启用以下设置:

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
    

    【讨论】:

      【解决方案2】:

      您的服务器和浏览器之间是否有任何东西。一些代理在 Web 套接字和服务器发送事件方面存在问题。尝试选择transports in the javascript。我在 Firefox over OpenIG 上看到了类似的事情。 OpenIG 不喜欢服务器发送的事件,只是挂起。

      【讨论】:

      • 没什么,是本地开发环境
      【解决方案3】:

      您需要调查的一种可能性是您是否遇到了允许到 IIS 的连接数的限制。我不确定 websocket 连接是否包含在该限制中,但正常连接 - 并且长轮询连接将消耗其中一个 - 在 Windows 8 的“基本”版本上通常限制为“3”(并且受到限制到 10 在专业版和其他版本上)。我猜你的长轮询连接正在消耗所有可用的连接,这就是导致其他一切超时的原因。

      更多详情请看这里:

      http://www.jpelectron.com/sample/WWW%20and%20HTML/IIS-%20OS%20Version%20Limits.htm

      我要么升级到专业版(如果你已经是“专业版”,那么请打折这个答案),或者安装 Websockets 看看是否有帮助。

      【讨论】:

      • 如果您打开了多个浏览器,您仍然可以轻松达到 10 ;)
      【解决方案4】:

      好的,感谢所有回答的人,你们都帮助调试了这个问题,不幸的是没有任何效果。

      问题原来是我需要在 web.config 中设置 targetFramework 属性:

      <httpRuntime targetFramework="4.5.1">
      

      之后一切顺利。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 2020-08-23
        • 2021-01-04
        • 2021-10-28
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        相关资源
        最近更新 更多