Beispiel #1
0
        private async void HandleIncoming(WebSocket socket, CancellationToken token)
        {
            ArraySegment <byte> buffer = new ArraySegment <byte>(new byte[1024]);

            while (true)
            {
                WebSocketReceiveResult socketResult;
                try
                {
                    socketResult = socket.ReceiveAsync(buffer, token).GetAwaiter().GetResult();
                }
                catch (System.IO.IOException e)
                {
                    Log.LogWarning(e, "Socket closed unexpectedly.");
                    return;
                }

                if (socketResult.MessageType == WebSocketMessageType.Close)
                {
                    return;
                }

                if (socketResult.Count > 1024)
                {
                    await socket.CloseAsync(WebSocketCloseStatus.MessageTooBig, "Message frame exceeded 1024 bytes.", token);

                    return;
                }

                // Deserialize request
                string requestJson = Encoding.UTF8.GetString(buffer.Array, 0, socketResult.Count);
                Log.LogTrace($"RECEIVED REQUEST (RAW)");
                Log.LogTrace($"  Data: {requestJson}");

                var request = JsonSerializer.Deserialize <RemoteRequestIncoming>(requestJson);
                Log.LogDebug("RECEIVED REQUEST");
                Log.LogDebug($"  Object ID: {request.obj}");
                Log.LogDebug($"  Method   : {request.method}");
                Log.LogDebug($"  Args     : [{string.Join(", ", request.args.Select(x => x.ToString()))}]");

                // Call method
                RemoteResultOutgoing result = CallMethod(request);
                Log.LogDebug("SENDING RESULT");
                Log.LogDebug($"  Error : {result.error}");
                Log.LogDebug($"  Result: {result.result}");

                // Serialize result
                var resultJson = JsonSerializer.SerializeToUtf8Bytes(result);
                Log.LogTrace("SENDING RESULT (RAW)");
                Log.LogTrace($"  Data: {Encoding.Default.GetString(resultJson)}");

                await socket.SendAsync(new ArraySegment <byte>(resultJson), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
Beispiel #2
0
        private RemoteResultOutgoing CallMethod(RemoteRequestIncoming request)
        {
            if (!registeredObjects.ContainsKey(request.obj))
            {
                return(RemoteResultOutgoing.FromErrorString("Requested object is not registered."));
            }

            var instance = registeredObjects[request.obj];

            var method = instance.GetType().GetMethod(request.method);

            if (method == null)
            {
                return(RemoteResultOutgoing.FromErrorString("Requested method of object does not exist."));
            }

            var mParams = method.GetParameters();

            var args = new object[request.args.Length];

            for (int i = 0; i < request.args.Length; i++)
            {
                var pType = mParams[i].ParameterType;
                var arg   = request.args[i];

                args[i] = JsonSerializer.Deserialize(arg.GetRawText(), pType);
            }

            try
            {
                var methodResult = instance.GetType().GetMethod(request.method).Invoke(instance, args);
                return(RemoteResultOutgoing.FromResultObject(methodResult));
            }
            catch (Exception e)
            {
                Log.LogError(e.ToString());
                return(RemoteResultOutgoing.FromErrorString("The called method resulted in an exception."));
            }
        }