2012-02-16 69 views
6

我使用signalr 0.4一個aspx頁上,Signalr停止了幾分鐘後做回調

var hub = $.connection.FooHub; 

hub.disconnected(function() {     
      log("Server has disconnected"); 
     }); 

hub.ShowInfo = function (Info) { .... } 

$("#Button1").click(function() { 
      hub.FooFunction('foo'); 
     }); 

$.connection.hub.start(); 

集線器的定義爲:

public class FooHub : Hub, IDisconnect 
{  
    ~FooHub() 
    { 
     log.Debug("FooHub Destroy"); 
    } 
    public FooHub() 
    { 
     log.Debug("FooHub Startup"); 
    }  
    public bool FooFunction(string stuff) 
    { 
     log.Debug("Hub FooFunction"); 
     Clients.ShowInfo(someInfo); 
     return true; 
    } 
    public Task Disconnect() 
    { 
     // Query the database to find the user by it's client id etc. etc. 
     MyController.Disconnect(Context.ConnectionId); 
     log.Debug("Hub Disconnnect " + Context.ConnectionId); 
     return null; 
    } 
    ...... 
} 

當我打開網頁,並立即點擊按鈕1
它調用Hub,然後調用頁面上的ShowInfo函數。
隨着Firebug我可以看到,信號使用長輪詢爲通信。因此,一切都按預期工作。

但是,當我再等幾分鐘
我看到

  • FooHub被破壞
  • 斷開是所謂的樞紐,

但頁面上沒有新的連接
Firebug顯示仍在執行的舊的
當我然後點擊按鈕 -

  • FooFunction叫(我看到在螢火一個新的連接)
  • FooHub創建
  • FooFunction在中心執行(沒有在日誌線)
  • ,但不執行ShowInfo

這是SignalR中的一個錯誤,還是我必須做別的事情才能獲得ShowInfo調用?

更新(可能的答案):

將其使用永遠幀,而不是長輪詢。

此外,問題似乎主要發生在使用移動互聯網(usb-stick)和Firefox時。

將交通工具更改爲長輪詢似乎解決了這個問題。

回答

1

你提到切換到長輪詢而不是使用永遠的框架,但沒有說如何做到這一點。您可以指定在啓動連接時嘗試使用哪些傳輸。

connection.start({ transport: ['longPolling','webSockets'] }); 

有關更多選項,請參閱https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client