gpt4 book ai didi

jquery - SignalR 连接卡住其他 ajax 请求

转载 作者:行者123 更新时间:2023-12-03 22:22:14 25 4
gpt4 key购买 nike

我使用基于SignalR(jquery.signalR-2.0.0-beta2.js)的实时消息系统开发了一个asp.net mvc应用程序。问题是 SignalR 连接启动后无法加载所有部分 View 。在这种情况下,所有 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>

呈现部分 View 的 Ajax 调用:

函数LoadActivities(id,类型,容器,操作,加载器路径){

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);
});

}

最佳答案

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

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

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

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

Network Monitor

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

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

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();
}
},

在 Controller 中:

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

关于jquery - SignalR 连接卡住其他 ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17813094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com