首页 > 解决方案 > HttpListener 打开后忽略 websocket 请求

问题描述

我有简单的 httpListener 来拦截 websocket 通信。下面的服务器充当主机和目标服务器之间的代理

public class Server
    {
        WebSocket webSocket = null;
        DeviceServiceMain dsService = null;
        public async void start(string prefix)
        {
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add(prefix);
            listener.Start();

        while (true)
        {
            HttpListenerContext listenerContext = listener.GetContext();
            if (!listenerContext.Request.IsWebSocketRequest)
            {
                ProcessPostRequest(listenerContext);
            }
            else
            {
                ProcessRequest(listenerContext);
            }
        }
    }

    public async void ProcessRequest(HttpListenerContext listenerContext)
    {

        try
        {
            WebSocketContext webSocketContext = await listenerContext.AcceptWebSocketAsync(subProtocol: null);
            webSocket = webSocketContext.WebSocket;
            byte[] receiveBuffer = new byte[1024 * 4];
            while (webSocket.State == WebSocketState.Open)
            {

                WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
                if (receiveResult.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
                    dsService.disconnect();
                }
                else if (receiveResult.MessageType == WebSocketMessageType.Text)
                {
                    string data = Encoding.UTF8.GetString(receiveBuffer, 0, receiveResult.Count);
                    List<ConnectDto> list = (List<ConnectDto>)Newtonsoft.Json.JsonConvert.DeserializeObject(data, typeof(List<ConnectDto>));
                    dsService = new DeviceServiceMain(list[0].clientID, webSocket);
                    dsService.connect("localhost", "8050", false, false, list[0].requestID);

                }
                else
                {
                    await webSocket.SendAsync(new ArraySegment<byte>(receiveBuffer, 0, receiveResult.Count), WebSocketMessageType.Binary, receiveResult.EndOfMessage, CancellationToken.None);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            if (webSocket != null)
            {
                webSocket.Dispose();
            }
        }
    }

    public async void ProcessPostRequest(HttpListenerContext listenerContext)
    {

    }
}

在屏幕上:在此处输入图像描述 你看到我打开套接字没有问题。然后我收到来自目标服务器的心跳。但是当我尝试在此套接字上发送任何其他请求时,它不会触发我的processRequest方法,因此我无法正确关闭套接字。我在这里做错了什么?

标签: c#websocket

解决方案


推荐阅读