如何在回发后保持.NET Socket对象连接打开?

时间:2012-09-21 06:41:22

标签: c# asp.net sockets postback

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

1 个答案:

答案 0 :(得分:0)

会话状态很脆弱;实际上,如果使用序列化会话状态提供程序(套接字不可序列化),您所描述的内容甚至无法工作。

所以:不是将 socket 存储在会话中,而是将套接字放在其他地方 - 也许是同步字典 - 并在会话中只存储密钥。例如:

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情况,并且您还需要添加自己的同步,以防止来自同一会话的两个并发请求使用相同的套接字(完全合法)。

但是,作为补充说明:

  • 你需要一些额外的过程来清理被遗弃的会话中的旧套接字,以及来自健康会议的僵尸套接字
  • 您将需要继续返回同一服务器的请求 - 如果您在群集中,那么“粘性”负载平衡