Как использовать прокси с библиотекой 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!");
}