Asp.net mvc 4 未连接的信号器多次呼叫

Asp.net mvc 4 未连接的信号器多次呼叫,asp.net-mvc-4,signalr,signalr-hub,Asp.net Mvc 4,Signalr,Signalr Hub,我有一个asp.NETMVC4应用程序,它使用信号器 当一个用户连接时,我想通知所有人(暂时发送到“all”只是为了测试它)。在我的中心课程中,我有: public override System.Threading.Tasks.Task OnConnected() { NotifyAllOfUserLogin(); return base.OnConnected(); } <script type="text/j

我有一个asp.NETMVC4应用程序,它使用信号器

当一个用户连接时,我想通知所有人(暂时发送到“all”只是为了测试它)。在我的中心课程中,我有:

    public override System.Threading.Tasks.Task OnConnected()
    {
        NotifyAllOfUserLogin(); 
        return base.OnConnected();
    }
        <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>
在_layout.cshtml中,我有以下内容:

    public override System.Threading.Tasks.Task OnConnected()
    {
        NotifyAllOfUserLogin(); 
        return base.OnConnected();
    }
        <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>

$(文档).ready(函数(){
var proxy=$.connection.messagehub;
proxy.client.messageAll=函数(消息){
$(“#消息”).prepend(“

'+消息+”


”); }; $(“#btnSubmitMessage”)。单击(函数(){ proxy.server.messageAll($(“#txtMessage”).val(); $(“#txtMessage”).val(“”); }); $.connection.hub.start(); });
虽然这是可行的,但我认为在母版页中编写这是一个错误,因为对于继承母版的每个页面,都会重新初始化集线器连接,因此会多次调用OnConnected


我应该如何正确处理这个问题,仅当用户登录到应用程序时调用OnConnect,当用户注销时调用onDisconnected?

对于每个页面加载,都会建立一个新的连接。当该页关闭时,该特定连接也会关闭


您需要做的是在服务器端跟踪用户的连接ID。您需要跟踪与每个特定用户帐户相关的活动连接,以及它们断开连接的时间。这样,如果没有预先存在的与该用户相关的活动连接ID,则可以通知所有用户该用户已连接。

对于每次页面加载,都会建立新连接。当该页关闭时,该特定连接也会关闭


您需要做的是在服务器端跟踪用户的连接ID。您需要跟踪与每个特定用户帐户相关的活动连接,以及它们断开连接的时间。这样做,如果没有预先存在的与该用户相关的活动连接ID,则可以通知所有用户该用户已连接。

因此,实际上可以使用$.connection.hub.start();在母版页中调用,因为所有操作都是通过连接ID进行的?谢谢,这开始有意义了。是的,完全没问题。如何处理与信号集线器的连接完全取决于您。请记住,应用程序中的每个页面都会导致打开/关闭页面上的连接/断开连接。我还注意到每个页面上的连接/断开连接-显然,因为我在母版页中完成了所有这些操作,但如果您的意思是我不必担心,因为这不是问题,那么好的,您是如何解决问题的?在我的例子中,我收到了多个通知,因为最后一页的最后一个连接仍然处于活动状态,需要一段时间才能断开连接,所以实际上可以使用$.connection.hub.start();在母版页中调用,因为所有操作都是通过连接ID进行的?谢谢,这开始有意义了。是的,完全没问题。如何处理与信号集线器的连接完全取决于您。请记住,应用程序中的每个页面都会导致打开/关闭页面上的连接/断开连接。我还注意到每个页面上的连接/断开连接-显然,因为我在母版页中完成了所有这些操作,但如果您的意思是我不必担心,因为这不是问题,那么好的,您是如何解决问题的?在我的例子中,我收到多个通知,因为最后一页的最后一个连接仍然处于活动状态,需要一段时间才能断开