在调用 ConnectAsync 之前配置 ClientWebSocket 的选项。先启动连接、之后才分配代理,对那次握手来说已经太晚。

using var socket = new ClientWebSocket();
socket.Options.Proxy = new WebProxy("http://203.0.113.10:8080")
{
    Credentials = new NetworkCredential(proxyUser, proxyPassword)
};
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
await socket.ConnectAsync(new Uri("wss://example.com/socket"),
                          deadline.Token);

地址和帐户变量仅为示例。所需的命名空间包括 System.Net、System.Net.WebSockets 和 System.Threading。请使用部署中的运行时、平台和代理服务所支持的凭据类型与身份验证机制。

WebProxy 的凭据属于代理。ClientWebSocketOptions 还有一个单独的 Credentials 属性,用于 WebSocket 服务器的身份验证。分配其中一个并不会自动满足另一方。

对于安全的 WebSocket 连接,被拒绝的代理隧道可能使目标的 WebSocket 握手根本无法开始。请将代理连接和身份验证的证据与目标的 HTTP upgrade 响应以及后续 WebSocket 流量区分开。

连接成功只是会话的开始。在应用程序的整个生命周期内,请显式处理接收/发送的取消和资源清理;此草图中的应用期限并不是针对后续每条消息的完整策略。

相关文章