C# 如何在回发后保持.NET套接字对象连接打开?
我在一个ASP.NET网站上工作,该网站要求创建一个套接字,并在当前会话的所有页面上保持连接。我已经创建了套接字并将其存储为会话对象,在页面重定向后它仍保持连接,但每当发生回发(例如单击按钮)时,连接就会关闭。是否有任何方法可以在回发后保持套接字连接打开,因为要求在整个会话中使用单个连接,并且不能重新连接套接字 会话状态是脆弱的;事实上,如果您使用的是序列化会话状态提供程序(套接字是不可序列化的),那么您所描述的内容甚至不起作用 因此:与其在会话中存储套接字,不如将套接字放在其他地方—可能是一个同步字典—并在会话中只存储它的密钥。例如:C# 如何在回发后保持.NET套接字对象连接打开?,c#,asp.net,sockets,postback,C#,Asp.net,Sockets,Postback,我在一个ASP.NET网站上工作,该网站要求创建一个套接字,并在当前会话的所有页面上保持连接。我已经创建了套接字并将其存储为会话对象,在页面重定向后它仍保持连接,但每当发生回发(例如单击按钮)时,连接就会关闭。是否有任何方法可以在回发后保持套接字连接打开,因为要求在整个会话中使用单个连接,并且不能重新连接套接字 会话状态是脆弱的;事实上,如果您使用的是序列化会话状态提供程序(套接字是不可序列化的),那么您所描述的内容甚至不起作用 因此:与其在会话中存储套接字,不如将套接字放在其他地方—可能是一个
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;
}
}
公共静态类SocketStore
{
静态只读字典socketStore
=新字典();
公共静态字符串添加(套接字)
{
如果(socket==null)抛出新的ArgumentNullException(“socket”);
字符串newKey=Guid.NewGuid().ToString();
锁(socketStore){
添加(newKey,socket);
}
返回newKey;
}
公共静态套接字获取(字符串键)
{
if(string.IsNullOrEmpty(key))抛出新的ArgumentNullException(“key”);
套接字结果;
锁(socketStore)
{
如果(!socketStore.TryGetValue(key,out result))结果为空;
}
返回结果;
}
}
在使用过程中,如果您还没有套接字(/key),请创建连接,将其与Add
一起存储,然后将密钥存储在会话中。获取时,必须处理null
情况,并且还需要添加自己的同步,以防止来自同一会话的两个并发请求使用同一套接字(完全合法)
然而,作为补充说明:
- 您将需要一些额外的过程来清除废弃会话中的旧套接字,以及从外观健康的会话中清除僵尸套接字
- 您将需要请求不断返回到同一台服务器,因此如果您在集群中,负载平衡是“粘性”的
套接字上
)?还有:发生了什么?它会引发异常吗?如果是:什么例外?它堵住了吗?什么?我正在使用System.Net.Socket类的Send(byte[]buffer,SocketFlags SocketFlags)方法。它被封锁了,我没有得到任何例外。下面是代码:publicstringsend(stringdata){byte[]buffer=Encoding.UTF8.GetBytes(data+“\r\n”);int byteCount=socket.send(buffer,SocketFlags.None);}@user1687951你说你被阻止了;到底发生了什么?你看到了吗?哎呀,看起来我发送的数据有问题。非常感谢您的耐心和帮助。:)