SignalR Connect返回504

时间:2014-06-19 00:15:46

标签: signalr

我对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调用和常规的webrequests超时。
  3. 使用fiddler我发现了以下内容:

    1. SignalR / hubs呼叫成功。
    2. SignalR协商呼叫成功。
    3. 使用HTTP 504连接WebSockets传输失败!
    4. 后续的连接调用尝试foreverFrame和长轮询,两者都以200。
    5. 成功
    6. 发出轮询请求并且永远不会退货!之后,一切都变得缓慢或挂起。
    7. 可能有助于调试的东西,如果我打开2个或更多标签,服务器就会挂起。单个标签似乎没问题。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您的服务器和浏览器之间是否有任何内容。某些代理在Web套接字和服务器发送事件时遇到问题。尝试选择transports in the javascript。我在Firefox上看到了与OpenIG类似的东西。 OpenIG不喜欢服务器发送事件而只是挂起。

答案 2 :(得分:0)

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

请点击此处了解更多详情:

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

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

答案 3 :(得分:0)

对于所有回答过的人来说,你们都帮助调试了这个问题,不幸的是没有任何效果。

问题结果我需要在web.config中设置targetFramework属性:

<httpRuntime targetFramework="4.5.1">

之后一切顺利。