【问题标题】:SignalR connection freeze other ajax requestsSignalR 连接冻结其他 ajax 请求
【发布时间】:2013-07-23 14:28:14
【问题描述】:

我用基于 SignalR (jquery.signalR-2.0.0-beta2.js) 的实时消息系统开发了一个 asp.net mvc 应用程序。问题是在 SignalR 连接启动后无法加载所有部分视图。在这种情况下,所有 ajax 请求之后 $.connection.hub.start({ transport: 'longPolling'}).done(function () { applicationHub.server.connectUser(); }) 保持挂起状态。是否可以使此请求异步或者它是 SignalR 中的错​​误?感谢您的帮助!

SignalR 调用:

<script type="text/javascript">

    $(document).ajaxStop(function () {
        var applicationHub = $.connection.applicationHub;

        if ($.connection.hub && $.connection.hub.state == $.signalR.connectionState.disconnected) {

            registerConversationClientMethods(applicationHub);

            $.connection.hub.start({ transport: 'longPolling'}).done(function () {
                applicationHub.server.connectUser();
            })
            .fail(function () {

            });
        }
    });
</script>

呈现局部视图的 Ajax 调用:

function LoadActivities(id, type, container, action, loaderpath) {

var url = action + '/?id=' + id + '&type=' + type;
var targetDiv = container;
var ajaxLoading = "<img id='ajax-loader' src='" + loaderpath + "' height='6' width='50' style='margin:5px;'>";

$(targetDiv).html("<div align='center'>" + ajaxLoading + "</div>");

$.get(url, null, function (result) {
    $(targetDiv).html(result);
});

}

【问题讨论】:

  • 您使用的是 iOS 吗?这是问题吗? github.com/SignalR/SignalR/issues/1406
  • 不,我使用的是 Windows 7。您的问题有类似的行为,但这不是我想出的问题。在 SignalR 的 ajax 请求开始 (poll?transport=longPolling&connectionToken=1Kpx%2B72...) 后,所有异步 ajax 请求都处于挂起状态,该请求也具有挂起状态(应该如此)。
  • Windows 7 + 完整 IIS(不是 iis express)的并发连接数限制为 10。您使用的是完整 iis 吗?
  • 这里有同样的问题。我有三个解决方案,其中一个有类似的问题。 Windows 8 和完整的 IIS。如果我通过开发控制台停止 SignalR 连接,则其他请求开始得到答复。当连接开始时,服务器没有响应。使用提琴手,我看到请求已发送。
  • 我为遇到“冻结”问题的网站解决了这个问题。会话状态在服务器根目录下启用。

标签: jquery asp.net-mvc signalr


【解决方案1】:

我对可能导致问题的原因有另一种解释。

自从 2013 年提出这个问题以来,我认为作者已经找到了解决问题的方法。但由于我花了几个小时来挖掘我的经验,我相信分享我的经验是我的责任。

架构概述:Asp.Net SPA 应用程序在客户端使用 AngularJS,在服务器端使用 WebApi 2.0 和 SignalR 2.1。

问题症状:应用程序启动并正常运行,但一段时间后所有请求(SignalR 和 WebApi)都卡住了。 “卡住”是指 WebApi 请求是在客户端发出的,但控制器方法永远不会被调用。第一个被冻结的始终是 SignalR 请求。

经过一番搜索,我找到了这些症状最可能的原因。这是this post by John Culviner 中详细描述的“会话状态阻塞”问题。

由于我的应用程序没有使用会话,我只是在应用程序级别将它们切换为只读模式:

protected void Application_Start()
{
    // Some extra initialization here
    Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
}

这没有帮助。

我继续我的研究,我相信到那时我已经阅读了每篇带有关键字SignalR、连接、卡住、冻结、挂起的文章或错误报告。似乎与我的案子无关。因此,我没有搜索所使用的技术可能存在的问题,而是开始分析我自己的代码可能出现的问题。它就在那里。

我的问题在article by Shaun 中有很好的描述。这是概述。在标准 MVC 世界中,SignalR 自己管理其连接。当您移动到另一个页面时,它会自动断开连接。因此,您可以只创建连接并忘记它。不幸的是,这不适用于 SPA/AngularJS 应用程序。 SignalR 连接永远不会知道 SPA 内的页面已更改,也永远不会断开连接。当您返回该页面时,将创建一个新的 SignalR 连接。根据我的观察,您需要执行此操作大约 10 次才能使为请求提供服务的管道卡住。

因此,您在这里要做的就是为 SignalR 连接创建一个停止函数,并在更改 SPA 内的页面之前手动调用它:

stop: function() {
    if (connection && connection.state && connection.state !== 4 /* disconnected */) {
        connection.stop();
    }
},

在控制器中:

$scope.$on('$destroy', function() {
    clientPushHubProxy.stop();
});

【讨论】:

  • 我面临同样的问题,但我没有使用 AngularJS(我使用的是 ASp.net MVC)。您能否建议如何使用 jquery 停止连接。
【解决方案2】:

让@bjornhol 的回答更进一步——所有 SignalR 请求(正在加载更多 AJAX)排队的问题也发生在我身上。我认为这是 jQuery 的问题,但实际上它是会话状态。对于该控制器,如果您可以将 SessionStateBehaviour 设置为 ReadOnly 或 Disabled,您将看到请求同时通过。也请查看此链接http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2012-05-28
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多