Procházet zdrojové kódy

Further Improvements to Rpc Connections

Frank van den Bos před 2 roky
rodič
revize
19e7c47c9f

+ 1 - 0
InABox.Client.RPC/Transports/IRPCClientTransport.cs

@@ -1,3 +1,4 @@
+using System;
 using InABox.Clients;
 using InABox.Core;
 

+ 1 - 1
InABox.Client.RPC/Transports/Pipe/RPCClientPipeTransport.cs

@@ -21,7 +21,7 @@ namespace InABox.Rpc
 
         public override void Connect()
         {
-            _pipe.ConnectAsync();
+            _pipe.ConnectAsync().Wait();
         }
 
         public override bool IsConnected() => _pipe?.IsConnected == true;

+ 1 - 1
InABox.Client.RPC/Transports/RPCClientTransport.cs

@@ -174,7 +174,7 @@ namespace InABox.Rpc
 
                 return result;
             }
-            catch (Exception)
+            catch (Exception e)
             {
                 return null;
             }

+ 34 - 20
InABox.Client.RPC/Transports/Socket/RPCClientSocketTransport.cs

@@ -1,4 +1,7 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using InABox.Clients;
 using InABox.Core;
@@ -9,11 +12,13 @@ namespace InABox.Rpc
 {
     public class RpcClientSocketTransport : RpcClientTransport, IDisposable
     {
-        private WebSocket _socket;
-        private string _url;
-        public RpcClientSocketTransport(string url)
+        private WebSocket? _socket;
+        
+        private string[] _urls;
+        
+        public RpcClientSocketTransport(string[] urls)
         {
-            _url = url;
+            _urls = urls;
         }
         
         private void Socket_OnOpen(object? sender, EventArgs e)
@@ -43,12 +48,13 @@ namespace InABox.Rpc
         }
 
 
-        private WebSocket CreateSocket(bool secure)
+        private WebSocket? CreateSocket(string url, bool secure)
         {
-            var socket = new WebSocket($"{(secure ? "wss" : "ws")}://{_url}");            
+            var address = $"{(secure ? "wss" : "ws")}://{url}";
+            var socket = new WebSocket(address);            
             
             // Time to wait before disconnect - the default meant that the client disconnected during debugging, since the ping would fail
-            socket.WaitTime = TimeSpan.FromSeconds(5);
+            socket.WaitTime = TimeSpan.FromSeconds(60);
             socket.OnOpen -= Socket_OnOpen;
             socket.OnError -= Socket_OnError;
             socket.OnClose -= Socket_OnClose;
@@ -65,20 +71,28 @@ namespace InABox.Rpc
 
                 return socket;
             }
-
             return null;
         }
-        
+
         public override void Connect()
         {
-            var findsocket = new Task<WebSocket>[]
+            List<Task<WebSocket>> tasks = new List<Task<WebSocket>>();
+            foreach (var url in _urls)
             {
-                Task<WebSocket>.Run(() => CreateSocket(true)),
-                Task<WebSocket>.Run(() => CreateSocket(false))
-            } ;
-            var index = Task.WaitAny(findsocket);
-            
-            _socket = findsocket[index].Result;
+                tasks.Add(Task<WebSocket>.Run(() => CreateSocket(url, true)));
+                tasks.Add(Task<WebSocket>.Run(() => CreateSocket(url, false)));
+            }
+            while (tasks.Count > 0)
+            {
+                var result = Task.WhenAny(tasks).Result;
+                if (result.Result == null)
+                    tasks.Remove(result);
+                else
+                {
+                    _socket = result.Result;
+                    return;
+                }
+            }
         }
 
         public override bool IsConnected() => _socket?.ReadyState == WebSocketState.Open;
@@ -86,16 +100,16 @@ namespace InABox.Rpc
         
         public override void Disconnect()
         {
-            _socket.Close(CloseStatusCode.Normal);
+            _socket?.Close(CloseStatusCode.Normal);
         }
 
         public override void Send(RpcMessage message)
         {
-            var buffer = Serialization.WriteBinary(message, BinarySerializationSettings.Latest);
-            _socket.Send(buffer);
+            var buffer = message.WriteBinary(BinarySerializationSettings.Latest);
+            _socket?.Send(buffer);
         }
 
-        protected override RpcClientTransport Clone() => new RpcClientSocketTransport(_url);
+        protected override RpcClientTransport Clone() => new RpcClientSocketTransport(_urls);
 
         public void Dispose()
         {

+ 20 - 14
InABox.Server/RPC/Handlers/Query.cs

@@ -19,22 +19,28 @@ namespace InABox.Rpc
             {
                 var task = Task.Run(() =>
                 {
-                    var start = DateTime.Now;
-                    Logger.Send(LogType.Information, user.UserID,
-                        string.Format("[{0} {1}] {2}", PlatformUtils.PlatformToString(session.Platform), session.Version, query.FullDescription()));
-
                     var table = new RpcQueryTable() { Key = query.Key };
+                    try
+                    {
+                        var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
+                        table.Table = store.Query(query.Filter, query.Columns, query.Sort);
+                    }
+                    catch (Exception e)
+                    {
+                        Logger.Send(
+                            LogType.Error, 
+                            user.UserID,
+                            string.Format(
+                                "[{0} {1}] Error: {2}\n{3}", 
+                                PlatformUtils.PlatformToString(session.Platform), 
+                                session.Version,
+                                e.Message,
+                                e.StackTrace
+                            )
+                        );                       
+                    }
                     
-                    var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
-                    table.Table = store.Query(query.Filter, query.Columns, query.Sort);
-
-                    Logger.Send(LogType.Information, user.UserID,
-                        string.Format("[{0} {1}] [{2:D8}] {3} Complete: {4}", PlatformUtils.PlatformToString(session.Platform), session.Version,
-                            (int)DateTime.Now.Subtract(start).TotalMilliseconds,
-                            query.ShortDescription(),
-                            table.FullDescription()));
-
-                    return table;
+                return table;
                 });
                 tasks.Add(task);
             }

+ 4 - 4
InABox.Server/RPC/RPCServer.cs

@@ -41,14 +41,14 @@ namespace InABox.Rpc
 
         private void Transport_OnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
         {
-            if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
-                OnLog?.Invoke(LogType.Information, "", $"Client Connected [{e.Session?.ID}]");
+            // if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
+            //     OnLog?.Invoke(LogType.Information, "", $"Client Connected [{e.Session?.ID}]");
         }
 
         private void Transport_OnClose(IRpcTransport transport, RpcTransportCloseArgs e)
         {
-            if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
-                OnLog?.Invoke(LogType.Information, "", $"Client Disconnected({e.Type}) [{e.Session?.ID}]");
+            // if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
+            //     OnLog?.Invoke(LogType.Information, "", $"Client Disconnected({e.Type}) [{e.Session?.ID}]");
         }
 
         private void Transport_BeforeMessage(IRpcTransport transport, RpcTransportMessageArgs e)

+ 1 - 1
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -1314,7 +1314,7 @@ namespace InABox.DynamicGrid
                             bRefresh = true;
                 }
                 if (bRefresh)
-                    Task.Run(() => { Dispatcher.Invoke(() => { Refresh(false, true); }); });
+                    Task.Run(() => { Dispatcher.Invoke(() => { Refresh(true, true); }); });
             }
             else
             {