2014-04-11 30 views
5

C# ve WebSocket4Net kitaplığını kullanarak güvenli bir WebKontrol istemcisi yapıyorum. Tüm bağlantıların standart bir proxy üzerinden proxy edilmesini istiyorum.WebSocket4Net kitaplığı ile proxy'leri kullanma

Bu lib, bir websocket bağlantısının proxy'sini belirtmek için SuperSocket.ClientEngine.Common.IProxyConnector'u kullanır, ancak bunu nasıl uygulayacağımı bilmiyorum.

Bu kütüphanede çalışan herhangi biri var mı ve tavsiyelerde bulunabilir mi?

cevap

12

Daha kolay hata ayıklama için Fiddler aracılığıyla tüm web bağlantısı bağlantılarını zorlamak için aynı şeyi yapmak zorundaydım. WebSocket4Net yazarı onun IProxyConnector arabirimini yeniden kullanmayı tercih ettiğinden, System.Net.WebProxy doğrudan kullanılamaz.

this link günü yazar CodePlex indirip SuperSocket.ClientEngine.Common.dll ve SuperSocket.ClientEngine.Proxy.dll ikisini içerebilir hangi onun ana kütüphanesinden SuperSocket.ClientEngine gelen uygulamaları kullanarak önerir. Bunu önermiyorum. Bu, derleme sorunlarına neden olur, çünkü (zayıf), her iki dll'de de tanımlanan IProxyConnector ile aynı ad alanını hem ClientEngine hem de WebSocket4Net ile kullanmayı seçmiştir. benim için çalıştı Ne


:

Fiddler aracılığıyla hata ayıklama için çalışma elde etmek için, benim çözelti içine bu iki sınıf kopyalanabilir ve yerel ad bunları değiştirdi:

HttpConnectProxy aşağıdaki satırda bir hata var gibiydi:

if (e.UserToken is DnsEndPoint)

değişim için:

Bundan sonra

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


, işler iyi çalıştı. Örnek kod:

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

Bu gerçekten bana biraz zaman kazandı - teşekkürler! – fcrick

+2

Bu çözümle proxy ile kimlik doğrulamanın bir yolu var mı? –

+0

Burada, vekil hakkında çok fazla istisna, önce çok fazla veri, sonra uyumsuz protokoller, sonra vekil bağlantıyı reddetti (aka 2xx durum kodu vermedi) ... Lütfen cevabı güncelleyin. – Gizmo