如何为Mariusz Kotas的Websocket.Client添加自定义HttpHeaders
解决Websocket.Client添加自定义Http请求头的问题
问题根源
你代码中直接访问client.NativeClient时出现空引用,是因为NativeClient在调用client.Start()之前并未完成初始化,只有在连接启动后才会被实例化。
推荐解决方案:使用HttpRequestMessageFactory自定义请求头
这是Websocket.Client官方推荐的自定义请求头方式,无需依赖NativeClient,且能保证重连时请求头自动生效:
using (var client = new WebsocketClient(url)) { // 通过HttpRequestMessageFactory创建带自定义头的请求 client.Options.HttpRequestMessageFactory = () => { var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Sec-WebSocket-Extensions", "permessage-deflate"); request.Headers.Add("Accept-Encoding", "gzip, deflate, br"); return request; }; client.ReconnectTimeout = TimeSpan.FromSeconds(30); client.ReconnectionHappened.Subscribe(info => Log.Information($"Reconnection happened, type: {info.Type}")); client.MessageReceived.Subscribe(msg => Log.Information($"Message received: {msg}")); client.Start(); Task.Run(() => client.Send("{ message }")); exitEvent.WaitOne(); }
备选方案:在连接建立后操作NativeClient
如果一定要通过NativeClient设置请求头,需在连接成功后(即NativeClient初始化完成后)进行操作,比如订阅ConnectionOpened事件:
using (var client = new WebsocketClient(url)) { client.ConnectionOpened.Subscribe(_ => { // 此时NativeClient已实例化,可设置请求头 client.NativeClient.Options.SetRequestHeader("Sec-WebSocket-Extensions", "permessage-deflate"); client.NativeClient.Options.SetRequestHeader("Accept-Encoding", "gzip, deflate, br"); }); client.ReconnectTimeout = TimeSpan.FromSeconds(30); client.ReconnectionHappened.Subscribe(info => Log.Information($"Reconnection happened, type: {info.Type}")); client.MessageReceived.Subscribe(msg => Log.Information($"Message received: {msg}")); client.Start(); Task.Run(() => client.Send("{ message }")); exitEvent.WaitOne(); }
注意:这种方式存在局限性——WebsocketClient重连时会重新创建
NativeClient,需要重新设置请求头,不如第一种方案可靠。
内容的提问来源于stack exchange,提问作者Zbyszko
相关产品推荐
相关产品推荐

