Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在回发后保持.NET套接字对象连接打开?_C#_Asp.net_Sockets_Postback - Fatal编程技术网

C# 如何在回发后保持.NET套接字对象连接打开?

C# 如何在回发后保持.NET套接字对象连接打开?,c#,asp.net,sockets,postback,C#,Asp.net,Sockets,Postback,我在一个ASP.NET网站上工作,该网站要求创建一个套接字,并在当前会话的所有页面上保持连接。我已经创建了套接字并将其存储为会话对象,在页面重定向后它仍保持连接,但每当发生回发(例如单击按钮)时,连接就会关闭。是否有任何方法可以在回发后保持套接字连接打开,因为要求在整个会话中使用单个连接,并且不能重新连接套接字 会话状态是脆弱的;事实上,如果您使用的是序列化会话状态提供程序(套接字是不可序列化的),那么您所描述的内容甚至不起作用 因此:与其在会话中存储套接字,不如将套接字放在其他地方—可能是一个

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

然而,作为补充说明:

  • 您将需要一些额外的过程来清除废弃会话中的旧套接字,以及从外观健康的会话中清除僵尸套接字
  • 您将需要请求不断返回到同一台服务器,因此如果您在集群中,负载平衡是“粘性”的

向我们展示您的代码。回发不会关闭套接字。这个套接字用于什么?您所说的连接:您是指浏览器和web服务器之间的连接吗,或者这是web服务器与未提及的第三方之间的连接?@MarcGravel-这是web服务器与另一台服务器之间的连接,其中一些数据将通过套接字传输。@user1687951我应该问:每个会话是否真的需要一个套接字?这听起来不太可伸缩。如果您控制两端的套接字,我强烈建议使用某种多路复用器,允许您在会话之间共享它。作为一个例子,在这里,我们相当多地使用redis:然而,每个应用程序域只有一个(yes:single)到服务器的套接字。我们只是分享它。。。很多。谢谢,这可以让插座保持连接,但我还有一个问题。发送一个数据包后,我无法发送另一个数据包。发送数据之间是否有默认的等待时间,或者我是否需要先释放任何资源?@user1687951您使用哪个API发送数据(至少有3个正好在
套接字上
)?还有:发生了什么?它会引发异常吗?如果是:什么例外?它堵住了吗?什么?我正在使用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你说你被阻止了;到底发生了什么?你看到了吗?哎呀,看起来我发送的数据有问题。非常感谢您的耐心和帮助。:)