All*_*cer 10 asp.net-mvc jquery signalr
我使用基于SignalR(jquery.signalR-2.0.0-beta2.js)的实时消息系统开发了一个asp.net mvc应用程序.问题是SignalR连接启动后无法加载所有部分视图.在这种情况下,$ .connection.hub.start({transport:'longPolling'})之后的所有ajax请求.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>
Run Code Online (Sandbox Code Playgroud)
呈现局部视图的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);
});
Run Code Online (Sandbox Code Playgroud)
}
我对可能导致问题的原因有另一种解释.
自从2013年提出这个问题以来,我认为作者已经找到了他的问题的解决方案.但由于我花了几个小时才挖掘我的,我相信我有责任分享我的经验.
架构概述: Asp.Net SPA应用程序在客户端使用AngularJS,在服务器端使用WebApi 2.0和SignalR 2.1.
问题症状:应用程序启动并正常运行但在一段时间后所有请求(SignalR和WebApi)都被卡住了."卡住"我的意思是WebApi请求是在客户端上进行的,但控制器方法永远不会被调用.第一个被冻结的是SignalR请求.

在做了一些搜索后,我发现了这些症状最可能的原因.这是John Culviner在本文中详细描述的"会话状态阻止"问题.
由于我的应用程序没有使用会话,我只是在应用程序级别将它们切换到只读模式:
protected void Application_Start()
{
// Some extra initialization here
Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
}
Run Code Online (Sandbox Code Playgroud)
这没有用.
我继续我的研究,我相信到那时我已经阅读了关键字SignalR,连接,卡住,冻结,挂起的每篇文章或错误报告.似乎没有什么事与我的情况有关.因此,我开始分析我自己的代码可能出错的问题,而不是搜索使用中的技术可能存在的问题.它就在那里.
我的问题在Shaun的这篇文章中有很好的描述.这是概述.在标准的MVC世界中,SignalR自己管理它的连接.当您移动到另一个页面时,它将自动断开连接.所以你可以创建连接并忘记它.不幸的是,SPA/AngularJS应用程序并不适用.SignalR连接永远不会知道SPA中的页面已被更改,并且永远不会自行断开连接.当您返回页面时,将创建一个新的SignalR连接.在我的观察中,你需要做大约10次,以使服务请求的管道卡住.
所以你要做的就是为SignalR连接创建一个stop函数,并在更改SPA中的页面之前手动调用它:
stop: function() {
if (connection && connection.state && connection.state !== 4 /* disconnected */) {
connection.stop();
}
},
Run Code Online (Sandbox Code Playgroud)
在控制器中:
$scope.$on('$destroy', function() {
clientPushHubProxy.stop();
});
Run Code Online (Sandbox Code Playgroud)
小智 1
进一步考虑 @bjornhol 的答案 - 所有 SignalR 请求(正在加载更多 AJAX)排队的相同问题也发生在我身上。我以为是 jQuery 的问题,但实际上是会话状态的问题。对于该控制器,如果您可以将 SessionStateBehaviour 设置为 ReadOnly 或 Disabled,您将看到请求同时通过。请参阅此链接http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |