Как использовать прокси с библиотекой WebSocket4Net

Я создаю безопасный клиент WebSockets с использованием C# и библиотеки WebSocket4Net. Я хотел бы, чтобы все мои соединения были прокси через стандартный прокси.

Эта библиотека использует SuperSocket.ClientEngine.Common.IProxyConnector указать прокси-соединение веб-сокета, но я не уверен, как я должен это реализовать.

Кто-нибудь работал с этой библиотекой и может дать совет?

1 ответ

Мне пришлось сделать то же самое, чтобы протолкнуть все соединения через веб-сокет через Fiddler, для облегчения отладки. Поскольку автор WebSocket4Net решил повторно использовать его IProxyConnector интерфейс, System.Net.WebProxy не может использоваться напрямую.

По этой ссылке автор предлагает использовать реализации из своей родительской библиотеки SuperSocket.ClientEngine которую вы можете скачать с CodePlex и включить как SuperSocket.ClientEngine.Common.dll а также SuperSocket.ClientEngine.Proxy.dll, Я не рекомендую это. Это вызывает проблемы компиляции, потому что он (плохо) решил использовать одно и то же пространство имен с обоими ClientEngine а также WebSocket4Net с IProxyConnector определен в обоих DLL.


Что сработало для меня:

Чтобы заставить его работать для отладки через Fiddler, я скопировал эти два класса в свое решение и изменил их на локальное пространство имен:

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!");
}
Другие вопросы по тегам