예제 #1
0
 internal void OnEventNotificationMessage(SocketMessage message)
 {
     if (message.MemberName == nameof(INotifyPropertyChanged.PropertyChanged))
     {
         var eav = Deserialize <PropertyChangedWithDataEventArgs>(message);
         if (eav == null)
         {
             return;
         }
         Debug.WriteLine($"{this}: property notified {eav.PropertyName}, value {eav.Value}");
         var type  = GetType();
         var field = GetField(type, eav.PropertyName);
         if (field == null)
         {
             var property = type.GetProperty(eav.PropertyName);
             if (property != null)
             {
                 var value = eav.Value;
                 MethodParametersAlignment.AlignType(ref value, property.PropertyType);
                 property.SetValue(this, value);
             }
         }
         else
         {
             var value = eav.Value;
             MethodParametersAlignment.AlignType(ref value, field.FieldType);
             field.SetValue(this, value);
         }
         NotifyPropertyChanged(eav.PropertyName);
     }
     else
     {
         OnEventNotification(message);
     }
 }
예제 #2
0
 private T _send <T>(WebSocketMessage query)
 {
     if (_clientSocket.ReadyState == WebSocketState.Open)
     {
         _clientSocket.Send(Serialize(query));
         return(MethodParametersAlignment.AlignType <T>(WaitForResponse(query).Response));
     }
     else
     {
         return(default(T));
     }
 }
 void _alignContentTypes(ref object[] inputArray, Type[] inputTypes)
 {
     for (int i = 0; i < inputArray.Length; i++)
     {
         object input        = inputArray[i];
         Type   requiredType = inputTypes[i];
         if (input != null)
         {
             Type actualType = input.GetType();
             if (actualType != requiredType)
             {
                 MethodParametersAlignment.AlignType(ref input, requiredType);
                 inputArray[i] = input;
             }
         }
     }
 }
예제 #4
0
        void _onEventNotificationMessage(object sender, WebSocketMessageEventArgs e)
        {
            if (e.Message.DtoGuid == DtoGuid)
            {
                Debug.WriteLine($"ProxyBase: Event {e.Message.MemberName} notified on {this} with value {e.Message.Response}");
                if (e.Message.MemberName == nameof(INotifyPropertyChanged.PropertyChanged))
                {
                    PropertyChangedWithValueEventArgs eav = e.Message.Response as PropertyChangedWithValueEventArgs;
                    if (eav != null)
                    {
                        Type         type     = this.GetType();
                        PropertyInfo property =
                            type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).FirstOrDefault(p => p.GetCustomAttributes(typeof(JsonPropertyAttribute), true).Where(a => ((JsonPropertyAttribute)a).PropertyName == eav.PropertyName).Any());
                        if (property != null)
                        {
                            Debug.WriteLine(property.Name);
                        }
                        if (property == null)
                        {
                            property = type.GetProperty(eav.PropertyName);
                        }
//                        if (property.Name == "Commands")
//                            Debug.WriteLine(property.Name);
                        object value = eav.Value;
                        if (property != null)
                        {
                            MethodParametersAlignment.AlignType(ref value, property.PropertyType);
                        }
                        Properties[eav.PropertyName] = value;
                        NotifyPropertyChanged(eav.PropertyName);
                    }
                }
                else
                {
                    OnEventNotification(e.Message);
                }
            }
        }
예제 #5
0
        protected override void OnMessage(byte[] data)
        {
            var message = new SocketMessage(data);

            try
            {
                if (message.MessageType == SocketMessage.SocketMessageType.RootQuery)
                {
                    SendResponse(message, _initialObject);
                    _referenceResolver.ReferencePropertyChanged += ReferenceResolver_ReferencePropertyChanged;
                    _referenceResolver.ReferenceDisposed        += ReferencedObjectDisposed;
                }
                else // method of particular object
                {
                    var objectToInvoke = _referenceResolver.ResolveReference(message.DtoGuid);
                    if (objectToInvoke != null)
                    {
                        if (message.MessageType == SocketMessage.SocketMessageType.Query ||
                            message.MessageType == SocketMessage.SocketMessageType.Invoke)
                        {
                            var objectToInvokeType = objectToInvoke.GetType();
                            var methodToInvoke     = objectToInvokeType.GetMethods()
                                                     .FirstOrDefault(m => m.Name == message.MemberName &&
                                                                     m.GetParameters().Length == message.ParametersCount);
                            if (methodToInvoke != null)
                            {
                                var parameters       = DeserializeDto <SocketMessageArrayValue>(message.ValueStream);
                                var methodParameters = methodToInvoke.GetParameters();
                                for (var i = 0; i < methodParameters.Length; i++)
                                {
                                    MethodParametersAlignment.AlignType(ref parameters.Value[i],
                                                                        methodParameters[i].ParameterType);
                                }
                                object response;
                                try
                                {
                                    response = methodToInvoke.Invoke(objectToInvoke, parameters.Value);
                                }
                                catch (Exception e)
                                {
                                    SendException(message, e);
                                    throw;
                                }
                                if (message.MessageType == SocketMessage.SocketMessageType.Query)
                                {
                                    SendResponse(message, response);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown method: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == SocketMessage.SocketMessageType.Get ||
                                 message.MessageType == SocketMessage.SocketMessageType.Set)
                        {
                            var property = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (property != null)
                            {
                                if (message.MessageType == SocketMessage.SocketMessageType.Get &&
                                    property.CanRead)
                                {
                                    object response;
                                    try
                                    {
                                        response = property.GetValue(objectToInvoke, null);
                                    }
                                    catch (Exception e)
                                    {
                                        SendException(message, e);
                                        throw;
                                    }
                                    SendResponse(message, response);
                                }
                                else // Set
                                {
                                    if (property.CanWrite)
                                    {
                                        var parameter = DeserializeDto <object>(message.ValueStream);
                                        MethodParametersAlignment.AlignType(ref parameter, property.PropertyType);
                                        try
                                        {
                                            property.SetValue(objectToInvoke, parameter, null);
                                        }
                                        catch (Exception e)
                                        {
                                            SendException(message, e);
                                            throw;
                                        }
                                    }
                                    else
                                    {
                                        throw new ApplicationException(
                                                  $"Server: not writable property: {objectToInvoke}:{message.MemberName}");
                                    }
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == SocketMessage.SocketMessageType.EventAdd ||
                                 message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                        {
                            var ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                            if (ei != null)
                            {
                                if (message.MessageType == SocketMessage.SocketMessageType.EventAdd)
                                {
                                    AddDelegate(objectToInvoke, ei);
                                }
                                else if (message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                                {
                                    RemoveDelegate(objectToInvoke, ei);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown event: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                    }
                    else
                    {
                        SendResponse(message, null);
                        throw new ApplicationException($"Server: unknown DTO: {message.DtoGuid} on {message}");
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
        }
예제 #6
0
        protected override void OnMessage(byte[] data)
        {
            var message = new SocketMessage(data);

            try
            {
                if (message.MessageType == SocketMessage.SocketMessageType.RootQuery)
                {
                    _sendResponse(message, _initialObject);
                }
                else // method of particular object
                {
                    IDto objectToInvoke = _referenceResolver.ResolveReference(message.DtoGuid);
                    if (objectToInvoke != null)
                    {
                        if (message.MessageType == SocketMessage.SocketMessageType.Query ||
                            message.MessageType == SocketMessage.SocketMessageType.Invoke)
                        {
                            Type       objectToInvokeType = objectToInvoke.GetType();
                            MethodInfo methodToInvoke     = objectToInvokeType.GetMethods()
                                                            .FirstOrDefault(m => m.Name == message.MemberName &&
                                                                            m.GetParameters().Length == message.ValueCount);
                            if (methodToInvoke != null)
                            {
                                var             parameters       = DeserializeDto <SocketMessageArrayValue>(message.ValueStream);
                                ParameterInfo[] methodParameters = methodToInvoke.GetParameters();
                                for (int i = 0; i < methodParameters.Length; i++)
                                {
                                    MethodParametersAlignment.AlignType(ref parameters.Value[i],
                                                                        methodParameters[i].ParameterType);
                                }
                                object response = methodToInvoke.Invoke(objectToInvoke,
                                                                        BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null,
                                                                        parameters.Value, null);
                                if (message.MessageType == SocketMessage.SocketMessageType.Query)
                                {
                                    _sendResponse(message, response);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown method: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == SocketMessage.SocketMessageType.Get ||
                                 message.MessageType == SocketMessage.SocketMessageType.Set)
                        {
                            PropertyInfo property = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (property != null)
                            {
                                if (message.MessageType == SocketMessage.SocketMessageType.Get &&
                                    property.CanRead)
                                {
                                    object response = property.GetValue(objectToInvoke, null);
                                    _sendResponse(message, response);
                                }
                                else // Set
                                {
                                    if (property.CanWrite)
                                    {
                                        var parameter = DeserializeDto <object>(message.ValueStream);
                                        MethodParametersAlignment.AlignType(ref parameter, property.PropertyType);
                                        property.SetValue(objectToInvoke, parameter, null);
                                    }
                                    else
                                    {
                                        throw new ApplicationException(
                                                  $"Server: not writable property: {objectToInvoke}:{message.MemberName}");
                                    }
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == SocketMessage.SocketMessageType.EventAdd ||
                                 message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                        {
                            EventInfo ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                            if (ei != null)
                            {
                                if (message.MessageType == SocketMessage.SocketMessageType.EventAdd)
                                {
                                    _addDelegate(objectToInvoke, ei);
                                }
                                else if (message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                                {
                                    _removeDelegate(objectToInvoke, ei);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown event: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                    }
                    else
                    {
                        _sendResponse(message, null);
                        throw new ApplicationException($"Server: unknown DTO: {message.DtoGuid} on {message}");
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
        }
예제 #7
0
        protected override void OnMessage(MessageEventArgs e)
        {
            WebSocketMessage message = new WebSocketMessage(e.RawData);

            try
            {
                var user = AuthenticationService.FindUser(AuthenticationSource.IpAddress, Context?.UserEndPoint.Address.ToString());
                if (user == null)
                {
                    throw new UnauthorizedAccessException($"Access from {Context?.UserEndPoint.Address} not allowed");
                }
                Thread.CurrentPrincipal = new GenericPrincipal(user, new string[0]);

                if (message.MessageType == WebSocketMessage.WebSocketMessageType.RootQuery)
                {
                    _sendResponse(message, InitialObject);
                }
                else // method of particular object
                {
                    IDto objectToInvoke = _referenceResolver.ResolveReference(message.DtoGuid);
                    if (objectToInvoke != null)
                    {
                        if (message.MessageType == WebSocketMessage.WebSocketMessageType.Query ||
                            message.MessageType == WebSocketMessage.WebSocketMessageType.Invoke)
                        {
                            Type       objectToInvokeType = objectToInvoke.GetType();
                            MethodInfo methodToInvoke     = objectToInvokeType.GetMethods()
                                                            .FirstOrDefault(m => m.Name == message.MemberName &&
                                                                            m.GetParameters().Length == message.ValueCount);
                            if (methodToInvoke != null)
                            {
                                var             parameters       = DeserializeDto <WebSocketMessageArrayValue>(message.GetValueStream());
                                ParameterInfo[] methodParameters = methodToInvoke.GetParameters();
                                for (int i = 0; i < methodParameters.Length; i++)
                                {
                                    MethodParametersAlignment.AlignType(ref parameters.Value[i],
                                                                        methodParameters[i].ParameterType);
                                }
                                object response = methodToInvoke.Invoke(objectToInvoke,
                                                                        BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null,
                                                                        parameters.Value, null);
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.Query)
                                {
                                    _sendResponse(message, response);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown method: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == WebSocketMessage.WebSocketMessageType.Get ||
                                 message.MessageType == WebSocketMessage.WebSocketMessageType.Set)
                        {
                            PropertyInfo property = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (property != null)
                            {
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.Get &&
                                    property.CanRead)
                                {
                                    object response = property.GetValue(objectToInvoke, null);
                                    _sendResponse(message, response);
                                }
                                else // Set
                                {
                                    if (property.CanWrite)
                                    {
                                        var parameter = DeserializeDto <object>(message.GetValueStream());
                                        MethodParametersAlignment.AlignType(ref parameter, property.PropertyType);
                                        property.SetValue(objectToInvoke, parameter, null);
                                    }
                                    else
                                    {
                                        throw new ApplicationException(
                                                  $"Server: not writable property: {objectToInvoke}:{message.MemberName}");
                                    }
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                        else if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventAdd ||
                                 message.MessageType == WebSocketMessage.WebSocketMessageType.EventRemove)
                        {
                            EventInfo ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                            if (ei != null)
                            {
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventAdd)
                                {
                                    _addDelegate(objectToInvoke, ei);
                                }
                                else if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventRemove)
                                {
                                    _removeDelegate(objectToInvoke, ei);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown event: {objectToInvoke}:{message.MemberName}");
                            }
                        }
                    }
                    else
                    {
                        _sendResponse(message, null);
                        throw new ApplicationException($"Server: unknown DTO: {message.DtoGuid} on {message}");
                    }
                }
            }
            catch (Exception ex)
            {
                message.MessageType = WebSocketMessage.WebSocketMessageType.Exception;
                //SerializeDto(message, ex);
                //Send(message.Serialize());
                Logger.Error(ex);
                Debug.WriteLine(ex);
            }
        }
예제 #8
0
        protected override void MessageHandlerProc()
        {
            Thread.CurrentPrincipal = _sessionUser;

            while (!CancellationTokenSource.IsCancellationRequested)
            {
                try
                {
                    var message = TakeNextMessage();
                    if (message.MessageType != SocketMessage.SocketMessageType.EventNotification)
                    {
                        Logger.Trace("Processing message: {0}:{1}", message.MessageGuid, message.DtoGuid);
                    }
                    if (message.MessageType == SocketMessage.SocketMessageType.RootQuery)
                    {
                        SendResponse(message, _initialObject);
                    }
                    else // method of particular object
                    {
                        var objectToInvoke = ((ReferenceResolver)ReferenceResolver).ResolveReference(message.DtoGuid);
                        if (objectToInvoke != null)
                        {
                            Debug.WriteLine($"{objectToInvoke}:{message.MemberName}");
                            switch (message.MessageType)
                            {
                            case SocketMessage.SocketMessageType.Query:
                                var objectToInvokeType = objectToInvoke.GetType();
                                var methodToInvoke     = objectToInvokeType.GetMethods()
                                                         .FirstOrDefault(m => m.Name == message.MemberName &&
                                                                         m.GetParameters().Length == message.ParametersCount);
                                if (methodToInvoke != null)
                                {
                                    var parameters       = DeserializeDto <SocketMessageArrayValue>(message.ValueStream);
                                    var methodParameters = methodToInvoke.GetParameters();
                                    for (var i = 0; i < methodParameters.Length; i++)
                                    {
                                        MethodParametersAlignment.AlignType(ref parameters.Value[i],
                                                                            methodParameters[i].ParameterType);
                                    }
                                    object response = null;
                                    try
                                    {
                                        response = methodToInvoke.Invoke(objectToInvoke, parameters.Value);
                                    }
                                    catch (Exception e)
                                    {
                                        SendException(message, e);
                                        throw;
                                    }
                                    SendResponse(message, response);
                                }
                                else
                                {
                                    throw new ApplicationException(
                                              $"Server: unknown method: {objectToInvoke}:{message.MemberName}");
                                }
                                break;

                            case SocketMessage.SocketMessageType.Get:
                                var getProperty = objectToInvoke.GetType().GetProperty(message.MemberName);
                                if (getProperty != null)
                                {
                                    object response;
                                    try
                                    {
                                        response = getProperty.GetValue(objectToInvoke, null);
                                    }
                                    catch (Exception e)
                                    {
                                        SendException(message, e);
                                        throw;
                                    }
                                    SendResponse(message, response);
                                }
                                else
                                {
                                    throw new ApplicationException(
                                              $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                                }
                                break;

                            case SocketMessage.SocketMessageType.Set:
                                var setProperty = objectToInvoke.GetType().GetProperty(message.MemberName);
                                if (setProperty != null)
                                {
                                    var parameter = DeserializeDto <object>(message.ValueStream);
                                    MethodParametersAlignment.AlignType(ref parameter, setProperty.PropertyType);
                                    try
                                    {
                                        setProperty.SetValue(objectToInvoke, parameter, null);
                                        SendResponse(message, null);
                                    }
                                    catch (Exception e)
                                    {
                                        SendException(message, e);
                                        throw;
                                    }
                                }
                                else
                                {
                                    throw new ApplicationException(
                                              $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                                }
                                break;

                            case SocketMessage.SocketMessageType.EventAdd:
                            case SocketMessage.SocketMessageType.EventRemove:
                                var ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                                if (ei != null)
                                {
                                    if (message.MessageType == SocketMessage.SocketMessageType.EventAdd)
                                    {
                                        AddDelegate(objectToInvoke, ei);
                                    }
                                    else if (message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                                    {
                                        RemoveDelegate(objectToInvoke, ei);
                                    }
                                }
                                else
                                {
                                    throw new ApplicationException(
                                              $"Server: unknown event: {objectToInvoke}:{message.MemberName}");
                                }
                                SendResponse(message, null);
                                break;

                            case SocketMessage.SocketMessageType.ProxyFinalized:
                                ((ReferenceResolver)ReferenceResolver).RemoveReference(objectToInvoke);
                                SendResponse(message, null);
                                break;

                            case SocketMessage.SocketMessageType.ProxyResurrected:
                                ((ReferenceResolver)ReferenceResolver).RestoreReference(objectToInvoke);
                                break;
                            }
                        }
                        else
                        {
                            Logger.Debug("Dto send by client not found! {0}", message.DtoGuid);
                            SendResponse(message, null);
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                }
            }
        }
        protected override void OnMessage(MessageEventArgs e)
        {
            WebSocketMessage message = Deserialize <WebSocketMessage>(e.Data);

            try
            {
                if (message.MessageType == WebSocketMessage.WebSocketMessageType.RootQuery)
                {
                    _sendResponse(message, _initialObject);
                }
                else // method of particular object
                {
                    IDto objectToInvoke = _referenceResolver.ResolveReference(message.DtoGuid);
                    if (objectToInvoke != null)
                    {
                        if (message.MessageType == WebSocketMessage.WebSocketMessageType.Query ||
                            message.MessageType == WebSocketMessage.WebSocketMessageType.Invoke)
                        {
                            Type       objectToInvokeType = objectToInvoke.GetType();
                            MethodInfo methodToInvoke     = objectToInvokeType.GetMethods().FirstOrDefault(m => m.Name == message.MemberName && m.GetParameters().Length == message.Parameters.Length);
                            if (methodToInvoke != null)
                            {
                                ParameterInfo[] methodParameters = methodToInvoke.GetParameters();
                                _alignContentTypes(ref message.Parameters, methodParameters.Select(p => p.ParameterType).ToArray());
                                for (int i = 0; i < methodParameters.Length; i++)
                                {
                                    MethodParametersAlignment.AlignType(ref message.Parameters[i], methodParameters[i].ParameterType);
                                }
                                object response = methodToInvoke.Invoke(objectToInvoke, BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, message.Parameters, null);
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.Query)
                                {
                                    _sendResponse(message, response);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(string.Format("Server: unknown method: {0}:{1}", objectToInvoke, message.MemberName));
                            }
                        }
                        else
                        if (message.MessageType == WebSocketMessage.WebSocketMessageType.Get ||
                            message.MessageType == WebSocketMessage.WebSocketMessageType.Set)
                        {
                            PropertyInfo property = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (property != null)
                            {
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.Get && property.CanRead)
                                {
                                    object response = property.GetValue(objectToInvoke, null);
                                    _sendResponse(message, response);
                                }
                                else // Set
                                {
                                    if (property.CanWrite)
                                    {
                                        _alignContentTypes(ref message.Parameters, new Type[] { property.PropertyType });
                                        property.SetValue(objectToInvoke, message.Parameters[0], null);
                                    }
                                    else
                                    {
                                        throw new ApplicationException(string.Format("Server: not writable property: {0}:{1}", objectToInvoke, message.MemberName));
                                    }
                                }
                            }
                            else
                            {
                                throw new ApplicationException(string.Format("Server: unknown property: {0}:{1}", objectToInvoke, message.MemberName));
                            }
                        }
                        else
                        if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventAdd ||
                            message.MessageType == WebSocketMessage.WebSocketMessageType.EventRemove)
                        {
                            EventInfo ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                            if (ei != null)
                            {
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventAdd)
                                {
                                    _addDelegate(objectToInvoke, ei);
                                }
                                else
                                if (message.MessageType == WebSocketMessage.WebSocketMessageType.EventRemove)
                                {
                                    _removeDelegate(objectToInvoke, ei);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(string.Format("Server: unknown event: {0}:{1}", objectToInvoke, message.MemberName));
                            }
                        }
                    }
                    else
                    {
                        _sendResponse(message, null);
                    }
                    //throw new ApplicationException(string.Format("Server: unknown DTO: {0} on {1}", message.DtoGuid, message));
                }
            }
            catch (Exception ex)
            {
                message.MessageType = WebSocketMessage.WebSocketMessageType.Exception;
                message.Response    = ex;
                Send(_serialize(message));
                Debug.WriteLine(ex);
            }
        }
예제 #10
0
        protected override void OnMessage(SocketMessage message)
        {
            try
            {
                if (message.MessageType == SocketMessage.SocketMessageType.RootQuery)
                {
                    SendResponse(message, _initialObject);
                }
                else if (message.MessageType == SocketMessage.SocketMessageType.UnresolvedReference)
                {
                    SendResponse(message, DtoBase.FindDto(message.DtoGuid));
                }
                else // method of particular object
                {
                    var objectToInvoke = ((ServerReferenceResolver)ReferenceResolver).ResolveReference(message.DtoGuid);
                    if (objectToInvoke != null)
                    {
                        Debug.WriteLine($"{objectToInvoke}:{message.MemberName}");
                        switch (message.MessageType)
                        {
                        case SocketMessage.SocketMessageType.Query:
                        case SocketMessage.SocketMessageType.Invoke:
                            var objectToInvokeType = objectToInvoke.GetType();
                            var methodToInvoke     = objectToInvokeType.GetMethods()
                                                     .FirstOrDefault(m => m.Name == message.MemberName &&
                                                                     m.GetParameters().Length == message.ParametersCount);
                            if (methodToInvoke != null)
                            {
                                var parameters       = DeserializeDto <SocketMessageArrayValue>(message.ValueStream);
                                var methodParameters = methodToInvoke.GetParameters();
                                for (var i = 0; i < methodParameters.Length; i++)
                                {
                                    MethodParametersAlignment.AlignType(ref parameters.Value[i],
                                                                        methodParameters[i].ParameterType);
                                }
                                object response;
                                try
                                {
                                    response = methodToInvoke.Invoke(objectToInvoke, parameters.Value);
                                }
                                catch (Exception e)
                                {
                                    SendException(message, e);
                                    throw;
                                }
                                if (message.MessageType == SocketMessage.SocketMessageType.Query)
                                {
                                    SendResponse(message, response);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown method: {objectToInvoke}:{message.MemberName}");
                            }
                            break;

                        case SocketMessage.SocketMessageType.Get:
                            var getProperty = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (getProperty != null)
                            {
                                object response;
                                try
                                {
                                    response = getProperty.GetValue(objectToInvoke, null);
                                }
                                catch (Exception e)
                                {
                                    SendException(message, e);
                                    throw;
                                }
                                SendResponse(message, response);
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                            }
                            break;

                        case SocketMessage.SocketMessageType.Set:
                            var setProperty = objectToInvoke.GetType().GetProperty(message.MemberName);
                            if (setProperty != null)
                            {
                                var parameter = DeserializeDto <object>(message.ValueStream);
                                MethodParametersAlignment.AlignType(ref parameter, setProperty.PropertyType);
                                try
                                {
                                    setProperty.SetValue(objectToInvoke, parameter, null);
                                }
                                catch (Exception e)
                                {
                                    SendException(message, e);
                                    throw;
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown property: {objectToInvoke}:{message.MemberName}");
                            }
                            break;

                        case SocketMessage.SocketMessageType.EventAdd:
                        case SocketMessage.SocketMessageType.EventRemove:
                            var ei = objectToInvoke.GetType().GetEvent(message.MemberName);
                            if (ei != null)
                            {
                                if (message.MessageType == SocketMessage.SocketMessageType.EventAdd)
                                {
                                    AddDelegate(objectToInvoke, ei);
                                }
                                else if (message.MessageType == SocketMessage.SocketMessageType.EventRemove)
                                {
                                    RemoveDelegate(objectToInvoke, ei);
                                }
                            }
                            else
                            {
                                throw new ApplicationException(
                                          $"Server: unknown event: {objectToInvoke}:{message.MemberName}");
                            }
                            break;

                        case SocketMessage.SocketMessageType.ProxyFinalized:
                            RemoveReference(objectToInvoke);
                            break;
                        }
                    }
                    else
                    {
                        SendResponse(message, null);
                        throw new ApplicationException($"Server: unknown DTO: {message.DtoGuid} on {message}");
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
        }