You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:32:12