Mam problemy z wdrażaniem bezpiecznego klienta gniazd internetowych w systemie Osx. Używam ClientWebSocket z System.Net.WebSockets. Oto kod testowy:Klient Xamarin Mono Implementacja WebSocket nie działa dla bezpiecznych gniazd
static async Task RunLoop()
{
ClientWebSocket ws = new ClientWebSocket();
await ws.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None);
do
{
Console.Write("Enter message:");
var msg = Console.ReadLine();
if (msg == "quit")
{
break;
}
var b = new ArraySegment<byte>(UTF8Encoding.UTF8.GetBytes(msg));
await ws.SendAsync(b, WebSocketMessageType.Text, true, CancellationToken.None);
byte[] bb = new byte[2048];
ArraySegment<byte> buffer = new ArraySegment<byte>(bb);
var result = await ws.ReceiveAsync(buffer, CancellationToken.None);
switch (result.MessageType)
{
case WebSocketMessageType.Text:
Console.WriteLine(UTF8Encoding.UTF8.GetString(buffer.Array));
break;
case WebSocketMessageType.Close:
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
break;
}
} while (true);
}
static void Main(string[] args)
{
var task = RunLoop();
task.Wait();
}
Za każdym razem, gdy otrzymuję ten wyjątek, gdy wywoływana jest funkcja ReceiveAsync.
Cannot access a disposed object.
Nazwa obiektu: "System.Net.Sockets.NetworkStream".
at System.Net.WebConnection.Read (System.Net.HttpWebRequest request, System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0001f] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/System/System.Net/WebConnection.cs:1038
at System.Net.WebSockets.ClientWebSocket+<ReceiveAsync>c__AnonStorey5.<>m__0() [0x0017c] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs:259
at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x00012] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680
at System.Threading.Tasks.Task.Execute() [0x00016] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128
at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult() [0x00000] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357
at Test.MainClass+<RunLoop>c__async2.MoveNext() [0x001c0] in Program.cs:81
Wygląda na to, że gniazdo jest w jakiś sposób wyrzucone, ale nie mam pojęcia, dlaczego i gdzie. Ten sam kod działa dobrze na niezabezpieczonych stronach internetowych ("ws: //echo.websocket.org").
Wypróbowałem także WebSocket.Przenośne wdrożenie, ale miał prawie takie same problemy. Dla niezabezpieczonych stron internetowych działało dobrze, ale dla bezpiecznych stron internetowych zdarzenie OnMessage nigdy nie zostało wywołane. https://github.com/NVentimiglia/WebSocket.Portable
Ten sam kod działa poprawnie w systemie Windows dla wss. –
Po żądaniu jest alert po stronie serwera 'Frame 9852: 103 bajty na przewodzie (824 bity), przechwycone 103 bajty (824 bity) na interfejsie 0 Ethernet II, Src: Solarfla_07: de: fc (00: 0f : 53: 07: de: fc), Dst: Apple_aa: 05: d8 (68: 5b: 35: aa: 05: d8) Protokół internetowy wersja 4, Src: 54.77.29.155, Dst: 10.40.131.187 Kontrola transmisji Protokół, Src Port: 443, Dst Port: 52146, Seq: 5121, Ack: 1038, Len: 37 Secure Sockets Layer TLSv1 Record Layer: Encrypted Alert Rodzaj zawartości: Alert (21) Wersja: TLS 1.0 (0x0301) Długość: 32 Wiadomość alertu: Encrypted Ale rt' –
Czy udało się znaleźć obejście tego problemu? Mam podobny problem, mogę się połączyć tylko przy użyciu niezabezpieczonego protokołu i nie jestem pewien, jaką infrastrukturę WebSocket wybrać dla moich aplikacji Xamarin. – Cosmin