public void ResolveReferenceGuid_Referenced_ReturnProxy()
        {
            _knownDtos.Add(_mockObject.DtoGuid, new WeakReference <ProxyObjectBase>(_mockObject));
            var proxy = _clientReferenceResolver.ResolveReference(_mockObject.DtoGuid);

            Assert.AreEqual(_mockObject, proxy, "Objects are not the same!");
        }
Пример #2
0
        public void ResolveReferenceTest_UnknownGuid_ReturnNull()
        {
            var serverReferenceResolver = new ReferenceResolver();

            var dto = serverReferenceResolver.ResolveReference(new Guid());

            Assert.IsNull(dto, "dto not null!");
        }
Пример #3
0
        public void ResolveReferenceTest_NonReferenced_ReturnDto()
        {
            var           serverReferenceResolver = new ReferenceResolver();
            PrivateObject po         = new PrivateObject(serverReferenceResolver);
            var           mockObject = new MockServerObject("TestValue");
            var           _knownDtos = ((Dictionary <Guid, ServerObjectBase>)po.GetField("_knownDtos"));

            var _knownDtosCount = _knownDtos.Count;

            var stringGuid = serverReferenceResolver.GetReference(this, mockObject);
            var dto        = serverReferenceResolver.ResolveReference(new Guid(stringGuid));

            Assert.IsNotNull(dto);
            Assert.AreEqual(_knownDtosCount + 1, _knownDtos.Count);
        }
Пример #4
0
        private void _clientSocket_OnMessage(object sender, MessageEventArgs e)
        {
            WebSocketMessage message = new WebSocketMessage(e.RawData);
            var proxy = _referenceResolver.ResolveReference(message.DtoGuid) as ProxyBase;

            switch (message.MessageType)
            {
            case WebSocketMessage.WebSocketMessageType.EventNotification:
                proxy?.OnEventNotificationMessage(message);
                break;

            case WebSocketMessage.WebSocketMessageType.ObjectDisposed:
                _referenceResolver.RemoveReference(message.DtoGuid);
                proxy?.Dispose();
                break;

            default:
                _receivedMessages[message.MessageGuid] = message;
                _messageHandler.Set();
                break;
            }
        }
Пример #5
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);
            }
        }
Пример #6
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);
            }
        }
        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);
            }
        }