3

我正在一个 ASP.NET 站点上工作,该站点需要创建一个 Socket 并在当前会话的所有页面之间保持连接。我已将套接字创建并存储为会话对象,并在页面重定向后保持连接,但只要发生回发(例如单击按钮),连接就会关闭。即使在回发之后,有没有办法保持套接字连接打开,因为要求是整个会话使用单个连接并且重新连接套接字不是一种选择。

4

1 回答 1

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;
    }
}

在使用中,如果您还没有套接字(/key),请创建您的连接,使用 存储它Add,然后将密钥存储在会话中。获取时,您必须处理这种null情况,并且您还需要添加自己的同步,以防止来自同一会话的两个并发请求使用同一个套接字(完全合法)。

但是,作为附加说明:

  • 您将需要一些额外的过程来清除废弃会话中的旧套接字,以及看起来健康的会话中的僵尸套接字
  • 您将需要请求继续返回到同一台服务器 - 如果您在集群中,那么“粘性”负载平衡
于 2012-09-21T07:04:20.340 回答