NewLife/X

设置请求头。ws握手时可以传递Token
智能大石头 编写于 2024-06-12 00:59:51
共计: 修改1个文件,增加23行、删除0行。
修改 +23 -0
修改 +23 -0
diff --git a/NewLife.Core/Net/WebSocketClient.cs b/NewLife.Core/Net/WebSocketClient.cs
index 8c18124..c62b7d6 100644
--- a/NewLife.Core/Net/WebSocketClient.cs
+++ b/NewLife.Core/Net/WebSocketClient.cs
@@ -1,4 +1,5 @@
 using System.Net;
+using System.Net.Http.Headers;
 using System.Security.Cryptography;
 using NewLife.Data;
 using NewLife.Http;
@@ -21,6 +22,9 @@ public class WebSocketClient : TcpSession
 
     /// <summary>WebSocket心跳间隔。默认60秒</summary>
     public TimeSpan KeepAlive { get; set; } = TimeSpan.FromSeconds(120);
+
+    /// <summary>请求头。ws握手时可以传递Token</summary>
+    public IDictionary<String, String?>? RequestHeaders { get; set; }
     #endregion
 
     #region 构造
@@ -85,6 +89,16 @@ public class WebSocketClient : TcpSession
         return base.OnClose(reason);
     }
 
+    /// <summary>设置请求头。ws握手时可以传递Token</summary>
+    /// <param name="headerName"></param>
+    /// <param name="headerValue"></param>
+    public void SetRequestHeader(String headerName, String? headerValue)
+    {
+        RequestHeaders ??= new Dictionary<String, String?>();
+
+        RequestHeaders[headerName] = headerValue;
+    }
+
     #region 消息收发
     /// <summary>接收WebSocket消息</summary>
     /// <param name="cancellationToken"></param>
@@ -197,6 +211,15 @@ public class WebSocketClient : TcpSession
             Method = "GET",
             RequestUri = uri
         };
+
+        if (client is WebSocketClient ws && ws.RequestHeaders != null)
+        {
+            foreach (var item in ws.RequestHeaders)
+            {
+                request.Headers[item.Key] = item.Value!;
+            }
+        }
+
         request.Headers["Connection"] = "Upgrade";
         request.Headers["Upgrade"] = "websocket";
         request.Headers["Sec-WebSocket-Version"] = "13";