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!"); }
public void ResolveReferenceTest_UnknownGuid_ReturnNull() { var serverReferenceResolver = new ReferenceResolver(); var dto = serverReferenceResolver.ResolveReference(new Guid()); Assert.IsNull(dto, "dto not null!"); }
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); }
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; } }
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); } }
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); } }