2013-06-19 67 views
0

我有一個使用SignalR的asp.net mvc 4應用程序。SignalR OnConnected多次調用

當用戶連接時,我想通知所有人(發送到「全部」目前只是爲了測試它)。在我中心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,並且在用戶註銷時斷開連接?

回答

3

對於每個頁面加載,建立一個新的連接。當該頁面關閉時,類似於特定的連接關閉。

你想要做的是跟蹤服務器端的用戶連接ID。您需要跟蹤與每個特定用戶帳戶相關的活動連接,以及何時斷開連接。這樣做時,如果沒有與該用戶相關的預先存在的活動連接標識,則可以通知所有用戶有人連接。

+0

所以實際上可以使用$ .connection.hub.start();在masterpage中調用,因爲所有操作通過連接ID?謝謝,這開始有意義。 –

+1

是的,它完全沒問題。完全取決於您如何處理與SignalR集線器的連接。請記住,應用程序中的每個頁面都會導致打開/關閉頁面上的連接/斷開連接。 – SeanPrice

+0

我也注意到每一頁上的連接/斷開連接 - 顯然是因爲我在主頁面中做了所有這些,但如果你的意思是我不應該擔心它,因爲這不是問題,那麼確定 –

相關問題