internal static object[] BindParameter(IPhotonSerializer serializer, OperationContext context) { var arguments = context.Method.Arguments; var methodParameters = new object[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { var item = arguments[i]; object rawValue; context.OperationRequest.Parameters.TryGetValue((byte)i, out rawValue); if (rawValue == null) { if (item.IsOptional) { methodParameters[i] = item.DefaultValue; } else if (item.ParameterTypeIsClass || item.ParameterTypeIsNullable) { methodParameters[i] = null; } else if (item.ParameterTypeIsArray) { methodParameters[i] = Array.CreateInstance(item.ParameterType.GetElementType(), 0); } else { throw new InvalidOperationException($"Parameter Missing, {context.Hub.HubName}/{context.Method.MethodName}({item.Name})"); } } else { if (rawValue.GetType() != typeof(byte[])) { if (item.ParameterType != rawValue.GetType()) { if (item.ParameterTypeIsNullable) { methodParameters[i] = rawValue; // if nullable, use rawValue. continue; } var parameters = string.Join(", ", arguments.Select(x => { return((x == item) ? "[" + x.ParameterType.Name + " " + x.Name + "]" : x.ParameterType.Name + " " + x.Name); })); throw new InvalidOperationException($"Parameter Type Unmatch, {context.Hub.HubName}/{context.Method.MethodName}({parameters}) ReceivedType:{rawValue.GetType().Name} Value:{rawValue}"); } } methodParameters[i] = serializer.Deserialize(item.ParameterType, rawValue); } } return(methodParameters); }
public ServerHubContext(HubDescriptor hub, SendParameters sendParameters) { this.Hub = hub; this.SendParameters = sendParameters; this.Clients = new ServerHubClientProxy <T>(this); this.serializer = ((PhotonWireApplicationBase)PhotonWireApplicationBase.Instance).Serializer; }
internal static object[] BindParameter(IPhotonSerializer serializer, OperationContext context) { var arguments = context.Method.Arguments; var methodParameters = new object[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { var item = arguments[i]; object rawValue; context.OperationRequest.Parameters.TryGetValue((byte)i, out rawValue); if (rawValue == null) { if (item.IsOptional) { methodParameters[i] = item.DefaultValue; } else if (item.ParameterTypeIsClass || item.ParameterTypeIsNullable) { methodParameters[i] = null; } else if (item.ParameterTypeIsArray) { methodParameters[i] = Array.CreateInstance(item.ParameterType.GetElementType(), 0); } else { throw new InvalidOperationException($"Parameter Missing, {context.Hub.HubName}/{context.Method.MethodName}({item.Name})"); } } else { if (rawValue.GetType() != typeof(byte[])) { if (item.ParameterType != rawValue.GetType()) { if (item.ParameterTypeIsNullable) { methodParameters[i] = rawValue; // if nullable, use rawValue. continue; } var parameters = string.Join(", ", arguments.Select(x => { return (x == item) ? "[" + x.ParameterType.Name + " " + x.Name + "]" : x.ParameterType.Name + " " + x.Name; })); throw new InvalidOperationException($"Parameter Type Unmatch, {context.Hub.HubName}/{context.Method.MethodName}({parameters}) ReceivedType:{rawValue.GetType().Name} Value:{rawValue}"); } } methodParameters[i] = serializer.Deserialize(item.ParameterType, rawValue); } } return methodParameters; }
public static void Initialize(Assembly[] targetAssemblies, string[] targetTags, IPhotonSerializer serializer, bool enableExceptionReturnDebugError) { if (Interlocked.Increment(ref registeredEngine) != 0) { return; } var assemblies = targetAssemblies; var types = assemblies .SelectMany(x => { try { return(x.GetTypes()); } catch (ReflectionTypeLoadException ex) { return(ex.Types.Where(t => t != null)); } }); var engine = new PhotonWireEngine() { serializer = serializer, enableExceptionReturnDebugError = enableExceptionReturnDebugError }; Parallel.ForEach(types, type => { var hub = HubDescriptor.CreateIfPossible(type); if (hub == null) { return; } lock (engine.hubs) { // check tag if (targetTags.Length > 0) { if (!targetTags.Any(x => hub.HubTags.Contains(x))) { hub.CanExecute = false; } } var key = Tuple.Create(hub.HubKind, hub.HubId); if (engine.hubs.ContainsKey(key)) { throw new InvalidOperationException(string.Format("same hubId is not allowed, class:{0} hubid:{1}", hub.HubName, hub.HubId)); } engine.hubs.Add(key, hub); engine.hubsByType.Add(hub.HubType, hub); } }); Instance = engine; }
internal void SendOperation(int messageId, object result, string debugMessage, bool isError, IPhotonSerializer serializer, short?returnCode) { var parameters = new Dictionary <byte, object>(); parameters[ReservedParameterNo.RequestHubId] = hubId; parameters[ReservedParameterNo.MessageId] = messageId; var operationResponse = new OperationResponse() { OperationCode = OperationRequest.OperationCode, // return same code:) Parameters = parameters, DebugMessage = debugMessage }; parameters[ReservedParameterNo.ResponseId] = (serializer != null) ? serializer.Serialize(result) : result; if (!isError) { operationResponse.ReturnCode = 0; // success } else if (returnCode == null) { operationResponse.ReturnCode = -1; } else { operationResponse.ReturnCode = returnCode.Value; } var sendResult = Peer.SendOperationResponse(operationResponse, SendParameters); if (sendResult != SendResult.Ok) { PhotonWireApplicationBase.Instance.Logger.SendOperationFailed(PhotonWireApplicationBase.Instance.ApplicationName, hubId, OperationRequest.OperationCode, sendResult.ToString()); } }