安静点DGC 2023-03-24 11:38 采纳率: 77.3%
浏览 76
已结题

c#使用ClientWebSocket和服务端进行通信,但是在使用HttpWebRequest调服务器接口会出现超时现象

WPF项目里使用ClientWebSocket和服务端进行通信,一共有2个地方用到了,但是在使用HttpWebRequest调服务器接口会出现超时现象,在固定调用第三次的时候就会出现超时,之后一直都是超时,但是只要我注释掉其中一个使用ClientWebSocket的代码,就不会出现这个问题,我不明白ClientWebSocket还会影响到HttpWebRequest的使用吗,而且每次我都已经将其资源释放了,不明白为什么,有点崩溃,有没有厉害的,大概使用的结构就是下面形式:
对了,使用HttpWebRequest对象的时候我也都把资源释放了
还有,服务端使用了Ngnix来处理请求

ClientWebSocket _webSocket = null;
        // CancellationToken _cancellation = null;

        public async void ClientSocket()
        {
            try
            {
                _webSocket = new ClientWebSocket();
                CancellationToken _cancellation = new CancellationToken();
                //建立连接
                var url = "服务器url";

                await _webSocket.ConnectAsync(new Uri(url), _cancellation);

                var bsend = new byte[1024];

                await _webSocket.SendAsync(new ArraySegment<byte>(bsend), WebSocketMessageType.Binary, true, _cancellation); //发送数据

                while (true)
                {
                    var result = new byte[1024];

                    await _webSocket.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken()); 
 //这里就是一些服务器返回信息之后的本地处理
                    await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
                    _webSocket.Dispose();
                    _webSocket.Abort();
                    _webSocket = null;
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

为了以防万一,在别的地方我也主动做了一个关闭的处理:

 public async void CloseSocket()
        {
            if (_webSocket != null && _webSocket.State == WebSocketState.Open)
            {
                await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
                _webSocket.Dispose();
                _webSocket.Abort();

            }
        } 
  • 写回答

2条回答 默认 最新

  • wanghui0380 2023-03-24 15:08
    关注

    说实话,我完全没看懂这代码在干嘛。你从那个博文里抄的啊

    await _webSocket.ConnectAsync(new Uri(url), _cancellation);
     
                    var bsend = new byte[1024];
     
                    await _webSocket.SendAsync(new ArraySegment<byte>(bsend), WebSocketMessageType.Binary, true, _cancellation); //发送数据
    
    
    

    嗯,给服务器发一串1024字节的空数据干嘛??你服务器要求的么?

    while (true)
                    {
                        var result = new byte[1024];
     
                        await _webSocket.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken()); 
                        await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
                        _webSocket.Dispose();
                        _webSocket.Abort();
                        _webSocket = null;
                    }
    
    
    
    
    
    

    嗯,从服务器接收数据我能理解,但是后面一串关闭释放又是干啥的?

    websocket是长连接的,发一条收一条就关闭用哪门子的websocket啊。

    我觉着你先别急着改代码,自己先用netcore随便写个mock本地服务(花不了5分钟,1分钟建立一个net5/netcore项目,然后用use.websocket d带调试2分钟,编写一个ws的接收和发送代码2分钟)

    然后你连接你自己本地的服务器试试看连接本地的服务ok不ok,如果不ok在改你程序。如果ok,请联系你们的运维,让他检查nginx设置去

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 已采纳回答 3月25日
  • 修改了问题 3月24日
  • 修改了问题 3月24日
  • 展开全部

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效