我有一个使用SignalR的asp.net mvc 4应用程序。
当用户连接时,我想通知所有人(暂时发送到“所有”只是为了测试它)。在我的Hub clas中我有这个:
public override System.Threading.Tasks.Task OnConnected()
{
NotifyAllOfUserLogin();
return base.OnConnected();
}
在_layout.cshtml中,我有这个:
<script type="text/javascript">
$(document).ready(function () {
var proxy = $.connection.messagehub;
proxy.client.messageAll = function (message) {
$('#messages').prepend('<p style=\'white-space:pre;\'>' + message + '</p><br />');
};
$("#btnSubmitMessage").click(function () {
proxy.server.messageAll($("#txtMessage").val());
$("#txtMessage").val('');
});
$.connection.hub.start();
});
</script>
虽然这有效,但我认为在母版页中写这个是错误的,因为集线器连接将为每个继承主页的页面重新初始化,因此OnConnected将被调用很多次。
我应该如何正确处理此问题,仅在用户登录应用程序时调用OnConnect,并在用户注销时调用onDisconnected?
答案 0 :(得分:3)
对于每个页面加载,都会建立新连接。当该页面关闭时,类似于特定连接被关闭。
您要做的是在服务器端跟踪用户的连接ID。您需要跟踪与每个特定用户帐户相关的活动连接,以及断开连接时的活动连接。这样做,如果没有与该用户相关的预先存在的活动连接ID,您可以通知所有用户该连接的人。