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 には、WebSocket サーバーの認証用に別の Credentials プロパティもあります。一方を割り当てても、もう一方の当事者が自動的に満たされるわけではありません。

安全な WebSocket 接続では、拒否されたプロキシトンネルによって接続先の WebSocket ハンドシェイクがまったく開始できないことがあります。プロキシ接続と認証の証拠を、接続先の HTTP upgrade 応答やその後の WebSocket トラフィックから切り分けてください。

接続の成功はセッションの始まりにすぎません。アプリケーションの存続期間全体にわたり、受信/送信のキャンセルとリソースのクリーンアップを明示的に保ちます。このスケッチのセットアップ期限は、後続のすべてのメッセージに対する完全なポリシーではありません。

関連記事