11

C# と WebSocket4Net ライブラリを使用して、安全な WebSocket クライアントを構築しています。すべての接続を標準のプロキシ経由でプロキシしたいと考えています。

このライブラリは を使用しSuperSocket.ClientEngine.Common.IProxyConnectorて websocket 接続のプロキシを指定しますが、それをどのように実装すればよいかわかりません。

誰かがこのライブラリを使用しており、アドバイスを提供できますか?

4

1 に答える 1

20

デバッグを容易にするために、Fiddler を介してすべての websocket 接続をプッシュするために、同じことをしなければなりませんでした。IProxyConnectorWebSocket4Net の作成者は自分のインターフェイスを再利用することを選択したため、System.Net.WebProxy直接使用することはできません。

このリンクでは、著者は、CodePlex からダウンロードして と の両方を含めることができる親ライブラリの実装を使用することを提案していSuperSocket.ClientEngineます。これはお勧めしません。これにより、コンパイルの問題が発生します。これは、両方の dll で定義された IProxyConnectorと両方で同じ名前空間を使用することを (不十分に) 選択したためです。SuperSocket.ClientEngine.Common.dllSuperSocket.ClientEngine.Proxy.dllClientEngineWebSocket4Net


私のために働いたもの:

Fiddler を使用してデバッグできるようにするために、これら 2 つのクラスをソリューションにコピーし、ローカル名前空間に変更しました。

HttpConnectProxy には、次の行にバグがあるようです。

if (e.UserToken is DnsEndPoint)

への変更:

if (e.UserToken is DnsEndPoint || targetEndPoint is DnsEndPoint)


その後、物事はうまくいきました。サンプルコード:

private WebSocket _socket;

public Initialize()
{
    // initialize the client connection
    _socket = new WebSocket("ws://echo.websocket.org", origin: "http://example.com");

    // go through proxy for testing
    var proxy = new HttpConnectProxy(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
    _socket.Proxy = (SuperSocket.ClientEngine.IProxyConnector)proxy;

    // hook in all the event handling
    _socket.Opened += new EventHandler(OnSocketOpened);
    //_socket.Error += new EventHandler<ErrorEventArgs>(OnSocketError);
    //_socket.Closed += new EventHandler(OnSocketClosed);
    //_socket.MessageReceived += new EventHandler<MessageReceivedEventArgs>(OnSocketMessageReceived);

    // open the connection if the url is defined
    if (!String.IsNullOrWhiteSpace(url))
        _socket.Open();
}

private void OnSocketOpened(object sender, EventArgs e)
{
    // send the message
    _socket.Send("Hello World!");
}
于 2014-05-01T21:38:37.513 に答える