示例#1
0
        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);
        }
示例#2
0
 public ServerHubContext(HubDescriptor hub, SendParameters sendParameters)
 {
     this.Hub            = hub;
     this.SendParameters = sendParameters;
     this.Clients        = new ServerHubClientProxy <T>(this);
     this.serializer     = ((PhotonWireApplicationBase)PhotonWireApplicationBase.Instance).Serializer;
 }
示例#3
0
        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;
        }
示例#4
0
        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;
        }
示例#5
0
        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());
            }
        }