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
相关产品推荐
相关产品推荐

