C#使用ClientWebSocket如何设置自定义Sec-WebSocket-Protocol协议?
问题原因
ClientWebSocket 对 Sec-WebSocket-Protocol 请求头做了内部专属管控,直接调用 SetRequestHeader 手动设置该头会被内部的子协议校验逻辑覆盖,最终发出去的请求不会携带你设置的JWT值,因此触发服务端协议校验报错。Postman的WebSocket工具没有这层内部限制,所以直接设置头即可生效。
正确实现方案
使用 ClientWebSocketOptions 提供的 AddSubProtocol 方法传入JWT作为子协议即可,代码示例如下:
var client = new ClientWebSocket(); // 不要直接SetRequestHeader设置Sec-WebSocket-Protocol,用AddSubProtocol client.Options.AddSubProtocol("你的JWT字符串"); await client.ConnectAsync(new Uri("你的WebSocket服务地址"), CancellationToken.None);
注意事项
- 确保传入的JWT没有空格、换行等特殊字符,符合WebSocket子协议的token格式要求,原生JWT本身是Base64URL编码的三段式结构,天然符合要求不需要额外处理
- 若服务端要求同时传多个子协议,多次调用
AddSubProtocol依次添加即可
内容的提问来源于stack exchange,提问作者Joe Phillips
相关产品推荐
相关产品推荐

