我使用基于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);
});
}
答案 0 :(得分:6)
我对可能导致问题的原因有另一种解释。
自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连接创建一个stop函数,并在更改SPA中的页面之前手动调用它:
stop: function() {
if (connection && connection.state && connection.state !== 4 /* disconnected */) {
connection.stop();
}
},
在控制器中:
$scope.$on('$destroy', function() {
clientPushHubProxy.stop();
});
答案 1 :(得分:1)
进一步考虑@ bjornhol的答案 - 同样的所有SignalR请求(加载更多AJAX)排队的问题也发生在我身上。我认为这是问题的jQuery,但实际上它是会话状态。对于该控制器,如果您可以将SessionStateBehaviour设置为ReadOnly或Disabled,您将看到请求同时进行。请看这个链接http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/希望这会有所帮助。