Websocket连接-一段时间后未接收消息C#

Websocket连接-一段时间后未接收消息C#,c#,asp.net,websocket,C#,Asp.net,Websocket,我用C#构建了一个websocket服务器。相关代码如下。问题是当调用if(result.EndOfMessage)时,websocket将停止侦听更多消息。如果以后出现任何消息,则不会从客户端收到该消息 我如何在一段时间后从客户端接收消息 public async Task Listen(int port) { try { IPAddress serverAddress = IPAddress.Parse("127.0.0.1"); // localhost _lis

我用C#构建了一个websocket服务器。相关代码如下。问题是当调用
if(result.EndOfMessage)
时,websocket将停止侦听更多消息。如果以后出现任何消息,则不会从客户端收到该消息

我如何在一段时间后从客户端接收消息

public async Task Listen(int port)
{
  try
  {
    IPAddress serverAddress = IPAddress.Parse("127.0.0.1"); // localhost

    _listener = new TcpListener(serverAddress, port);
    _listener.Start();

    while (true)
    {
      TcpClient tcpClient = await _listener.AcceptTcpClientAsync();
      await Task.Run(() => 
    ProcessTcpClientAsync(tcpClient).ConfigureAwait(false));
    }
  }
  catch (SocketException ex)
  {
    throw new Exception(message, ex);
  }
}

private async Task<string> ProcessTcpClientAsync(TcpClient tcpClient)
{
  CancellationTokenSource source = new CancellationTokenSource();

  try
  {
    if (_isDisposed)
    {
      return string.Empty;
    }

    // get a secure or insecure stream
    NetworkStream stream = tcpClient.GetStream();
    WebSocketHttpContext context = await _webSocketServerFactory.ReadHttpHeaderFromStreamAsync(stream);

    if (context.IsWebSocketRequest)
    {
      WebSocket webSocket = await _webSocketServerFactory.AcceptWebSocketAsync(context);

      await RespondToWebSocketRequestAsync(webSocket, CancellationToken.None);
    }
  }
  catch (ObjectDisposedException ex)
  {
    // do nothing. This will be thrown if the Listener has been stopped
  }
  catch (Exception ex)
  {
  }
}

public async Task RespondToWebSocketRequestAsync(WebSocket webSocket, CancellationToken token)
{
  ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[BUFFER_SIZE]);

  while (true)
  {
    WebSocketReceiveResult result = await webSocket.ReceiveAsync(buffer, token);

    if (result.MessageType == WebSocketMessageType.Close)
    {
      break;
    }

    if (result.Count > BUFFER_SIZE)
    {
      await webSocket.CloseAsync(WebSocketCloseStatus.MessageTooBig,
          $"Web socket frame cannot exceed buffer size of {BUFFER_SIZE:#,##0} bytes. Send multiple frames instead.",
          token);
      break;
    }

    if (result.EndOfMessage)
    {
      break;
    }

    // Process data
    SomeMethod();
  }
}
公共异步任务侦听(int端口)
{
尝试
{
IPAddress serverAddress=IPAddress.Parse(“127.0.0.1”);//本地主机
_侦听器=新的TcpListener(服务器地址、端口);
_listener.Start();
while(true)
{
TcpClient TcpClient=await_listener.AcceptTcpClientAsync();
等待任务。运行(()=>
ProcessTcpClientAsync(tcpClient).ConfigureAwait(false));
}
}
捕获(SocketException例外)
{
抛出新异常(消息,ex);
}
}
专用异步任务进程TCPClientAsync(TcpClient TcpClient)
{
CancellationTokenSource=新的CancellationTokenSource();
尝试
{
如果(_isDisposed)
{
返回字符串。空;
}
//获取安全或不安全的流
NetworkStream=tcpClient.GetStream();
WebSocketHttpContext上下文=等待_webSocketServerFactory.ReadHttpHeaderFromStreamAsync(流);
if(context.IsWebSocketRequest)
{
WebSocket WebSocket=等待_webSocketServerFactory.AcceptWebSocketAsync(上下文);
等待响应ToWebSocketRequestAsync(webSocket,CancellationToken.None);
}
}
捕获(ObjectDisposedException ex)
{
//不执行任何操作。如果侦听器已停止,则会抛出此消息
}
捕获(例外情况除外)
{
}
}
公共异步任务RespondToWebSocketRequestAsync(WebSocket WebSocket,CancellationToken令牌)
{
ArraySegment buffer=新的ArraySegment(新字节[buffer_SIZE]);
while(true)
{
WebSocketReceiveResult结果=等待webSocket.ReceiveAsync(缓冲区、令牌);
if(result.MessageType==WebSocketMessageType.Close)
{
打破
}
如果(result.Count>缓冲区大小)
{
等待webSocket.CloseAsync(WebSocketCloseStatus.MessageTooBig,
$“Web套接字帧不能超过缓冲区大小{buffer_size:#,##0}字节。请改为发送多个帧。”,
代币);
打破
}
if(result.EndOfMessage)
{
打破
}
//过程数据
somethod();
}
}

通过使用所有
catch{}
块,您可以隐藏所有异常和消息,这些异常和消息会告诉您出了什么问题。
catch(ObjectDisposedException ex)
是不合理的-查找并删除僵尸对象,而不是掩盖问题OK,这是为了调试。例外情况永远不会被发现。我将删除它。您的问题可能是在收到消息时,
中断了
的永恒循环,而没有为新消息启动另一个异步。另外,您的
SomeMethod()
将永远不会被执行,因为您在它执行之前中断了
SomeMethod。