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

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 有没有会写mysql的,有偿做个问题
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥15 VB.NET2022如何生成发布成exe文件
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?