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

C#中通过WebSocket发送嵌套JSON数组的消息无服务器响应问题求助

C#中通过WebSocket发送嵌套JSON数组的消息无服务器响应问题求助

看起来你遇到的问题很典型,我帮你梳理下可能的问题点和解决方案:

1. 字段名大小写不匹配(最可能的核心原因)

观察你给出的服务器预期格式,其中的message是小写的,但你的BulkSubscribeMessage类里的Message属性没有添加JsonProperty特性来指定对应的小写键名。默认情况下,JsonConvert会把PascalCase的属性名序列化为同样的大写开头格式(也就是"Message"),这会导致服务器无法正确识别这个关键字段,自然不会返回响应。

修正方法很简单,给Message属性加上特性标记:

public class BulkSubscribeMessage
{
    [JsonProperty("_event")]
    public string Event { get; set; }

    [JsonProperty("tzID")]
    public int TimeZoneId { get; set; }

    [JsonProperty("message")] // 指定服务器期望的小写键名
    public string Message { get; set; }
}

2. 避免UTF-8 BOM干扰

Encoding.UTF8.GetBytes()默认会生成带BOM(字节顺序标记)的字节数组,部分对格式敏感的服务器会直接拒绝这类请求。你可以改用不带BOM的UTF8编码来生成字节流:

var encoding = new UTF8Encoding(false); // false表示不生成BOM
var buffer = encoding.GetBytes(jsonString);

3. 先确认WebSocket连接状态

发送消息前最好先检查_client的连接状态,避免在连接未建立或已断开的情况下无效发送:

if (_client.State != WebSocketState.Open)
{
    // 这里可以根据业务逻辑选择抛出异常、重新建立连接等操作
    throw new InvalidOperationException("WebSocket连接未处于可用的打开状态");
}

4. 简化序列化逻辑(可选优化)

你当前的序列化逻辑是先把对象转成JSON字符串,再放进列表二次序列化,其实可以直接构造预期的数组格式,减少一次序列化操作,也更直观:

// 先序列化单个消息对象
var singleMessageJson = JsonConvert.SerializeObject(message);
// 直接拼接成数组格式的字符串
string jsonString = $"[{singleMessageJson}]";

这个逻辑和你原来的代码结果完全一致,但能降低多余序列化带来的潜在问题。

5. 逐字符对比发送内容

你可以把最终生成的jsonString输出到控制台,和浏览器开发者工具里的预期格式逐字符对比,排查是否有细微差异(比如多余空格、转义字符不一致等):

Console.WriteLine(jsonString);

确保输出的内容和浏览器里的请求完全匹配,包括引号、逗号、字段名的大小写等细节。

备注:内容来源于stack exchange,提问作者Mattia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:28:07