c# - 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
方法,因此我无法正确关闭套接字。我在这里做错了什么?
解决方案
推荐阅读
- mysql - 在当前表上插入后,Mysql触发器更新其他表
- javascript - 如何将项目添加到 JSON 对象
- javascript - jQuery 根据其他元素的类隐藏或显示元素
- diameter-protocol - 使用 seagull 多次发送 Diameter 消息
- html - 带有可扩展子元素的 flexbox
- php - Access-Control-Allow-Origin'标头在角度 laravel 应用程序上存在错误
- import - 可以使用infile在sas程序中导入sas日志文件吗(以批处理模式执行,即PuTTY)?
- php - 没有获得 $_POST 数据 (PHP 7.1/Debian 8) LAMP 问题
- java - 如何将 AIResponse gson 转换为可用于 Text to Speech 的文本?
- apache-kafka - 通过生产者将大文件推入Kafka主题