2014-04-11 11 views
5

Sto costruendo un client WebSockets sicuro utilizzando C# e la libreria WebSocket4Net. Vorrei che tutte le mie connessioni fossero inoltrate tramite proxy standard.Come utilizzare i proxy con la libreria WebSocket4Net

Questa libreria utilizza lo SuperSocket.ClientEngine.Common.IProxyConnector per specificare un proxy di connessione websocket, ma non sono sicuro di come dovrei implementarlo.

Qualcuno ha collaborato con questa biblioteca e può offrire qualche consiglio?

risposta

12

Ho dovuto fare lo stesso, per spingere tutte le connessioni websocket tramite Fiddler, per facilitare il debugging. Poiché l'autore di WebSocket4Net ha scelto di riutilizzare la sua interfaccia IProxyConnector, System.Net.WebProxy non è direttamente utilizzabile.

Sulla this link l'autore suggerisce di utilizzare le implementazioni dalla sua biblioteca genitore SuperSocket.ClientEngine che può essere scaricato da CodePlex e comprendono sia il SuperSocket.ClientEngine.Common.dll e SuperSocket.ClientEngine.Proxy.dll. Non lo consiglio. Questo causa problemi di compilazione perché (scarsamente) ha scelto di utilizzare lo stesso spazio dei nomi con entrambi ClientEngine e WebSocket4Net con IProxyConnector definito in entrambe le DLL.


cosa ha funzionato per me:

per farlo funzionare per il debugging tramite Fiddler, ho copiato queste due classi nella mia soluzione, e cambiato in spazio dei nomi locale:

HttpConnectProxy sembrava avere un bug sul seguente riga:

if (e.UserToken is DnsEndPoint)

modifica:

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


Dopo di che, le cose funzionavano bene. Esempio di codice:

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!"); 
} 
+0

Questo mi ha davvero salvato un po 'di tempo - grazie! – fcrick

+2

C'è un modo per autenticarsi con il proxy con questa soluzione? –

+0

Qui ci sono molte eccezioni, una dopo l'altra sul proxy, prima troppi dati, quindi protocolli incompatibili, quindi il proxy ha rifiutato la connessione (ovvero non ha restituito il codice di stato 2xx) ... Si prega di aggiornare la risposta? – Gizmo

Problemi correlati