iisnode下ws模块WebSocket服务器收字符串变二进制消息问题
客户端发送字符串但ws+iisnode服务器收到Binary Message的问题
问题现象
客户端通过WebSocket.send()发送字符串Hello Server!,但服务器端使用ws模块接收到的却是Buffer对象(显示为Binary Message),typeof(message)返回object,而非预期的string。
原因分析
在iisnode环境下,ws模块将文本消息解析为二进制Buffer通常有以下原因:
- iisnode转发的帧标识丢失:iisnode作为中间层转发WebSocket数据时,未正确保留文本帧的类型标识,导致ws模块只能以二进制形式解析数据。
- rewrite规则路径格式错误:web.config中的rewrite规则使用了Windows风格的反斜杠
\,但URL路径必须使用正斜杠/,路径解析异常会间接干扰WebSocket帧的处理逻辑。 - ws模块版本兼容性问题:旧版ws模块在iisnode环境下可能存在文本帧解析的兼容性bug。
解决方案
方案1:服务器端手动转换Buffer为字符串
修改服务器端的消息处理逻辑,判断消息类型并转换为UTF-8字符串:
user.on("message", function(message){ // 若为Buffer则转为UTF-8字符串,否则直接使用原数据 const receivedData = Buffer.isBuffer(message) ? message.toString('utf8') : message; wss.clients.forEach(function(client){ if(client.readyState === WebSocket.OPEN){ client.send(typeof(receivedData)); client.send(receivedData); }; }); });
方案2:修正web.config的rewrite路径
将rewrite规则中的反斜杠改为正斜杠,确保URL路径解析正确:
<rule name="ws" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^ws/?$" /> <action type="Rewrite" url="/ws/node_app.js" /> </rule>
方案3:更新ws模块到最新版本
执行命令更新ws模块,修复可能存在的兼容性问题:
npm update ws
验证效果
修改后重新部署服务,服务器端应能正确接收并识别字符串类型的消息,客户端会收到string类型标识和原字符串内容。
内容的提问来源于stack exchange,提问作者Hilton Siegert
相关产品推荐
相关产品推荐

