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); } }
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; } } } }
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); } } }
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); } }
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 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); } }
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); } }