2012-09-21 95 views
2

我正在ASP.NET網站上工作,它需要創建單個套接字並在當前會話的所有頁面之間保持連接。我創建並存儲了套接字作爲會話對象,並且在頁面重定向後它仍保持連接狀態,但只要發生回發(例如單擊按鈕),連接就會關閉。即使在回發之後,是否有任何方法保持套接字連接打開,因爲要求在整個會話中使用單個連接,並且不能重新連接套接字。如何在回發後保持.NET Socket對象連接打開?

+0

向我們顯示您的代碼。回傳不會關閉套接字。這個插座用於什麼? – nunespascal

+0

你在談論的連接:你是指瀏覽器和網絡服務器之間的連接,還是網絡服務器和未提及的第三方之間的連接? –

+0

@MarcGravell - 連接位於Web服務器和另一個服務器之間,從那裏通過套接字傳輸一些數據。 – user1687951

回答

0

會話狀態很脆弱;實際上,如果您使用序列化會話狀態提供程序(套接字不可序列化),則描述的內容甚至不起作用。

所以:而不是存儲在會話中的插座,把插座其他地方 - 可能是同步的字典 - 並且只存儲一個關鍵給它的會話。例如:

public static class SocketStore 
{ 
    static readonly Dictionary<string, Socket> socketStore 
      = new Dictionary<string, Socket>(); 
    public static string Add(Socket socket) 
    { 
     if(socket == null) throw new ArgumentNullException("socket"); 
     string newKey = Guid.NewGuid().ToString(); 
     lock(socketStore) { 
      socketStore.Add(newKey, socket); 
     } 
     return newKey; 
    } 
    public static Socket Get(string key) 
    { 
     if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key"); 
     Socket result; 
     lock (socketStore) 
     { 
      if (!socketStore.TryGetValue(key, out result)) result = null; 
     } 
     return result; 
    } 
} 

在使用,如果你沒有一個插座(/鍵),請創建您的連接,它Add存儲,然後存儲在會話的關鍵。提取時,您必須處理null大小寫,您還需要添加自己的同步,以防止來自同一會話的兩個併發請求使用同一個套接字(完全合法)。

然而,隨着其他注意事項:

  • ,你會希望有一些額外的工藝清理下來廢棄的會話舊插座,和殭屍插座從看起來健康的會議
  • ,您將需要請求繼續回到同一臺服務器 - 如果您在羣集中,那麼「粘性」負載均衡
+0

謝謝,這可以保持套接字連接,但我有另一個問題。發送一個數據包後,我無法再發送一個數據包。發送數據之間是否有默認的等待期,或者是否需要首先發布任何資源? – user1687951

+0

@ user1687951你使用哪個API發送(在Socket上至少有3個)?另外:什麼*發生*?它會拋出異常嗎?如果是這樣:什麼例外?它阻止?什麼? –

+0

我正在使用System.Net.Socket類的Send(byte [] buffer,SocketFlags socketFlags)方法。它被阻止,我沒有得到任何異常。以下是代碼:public string send(string data) byte [] buffer = Encoding.UTF8.GetBytes(data +「\ r \ n」); int byteCount = socket.Send(buffer,SocketFlags.None); } – user1687951

相關問題