Beispiel #1
0
        public static string FastToString(this HubKind hubKind)
        {
            switch (hubKind)
            {
            case HubKind.Client:
                return(nameof(HubKind.Client));

            case HubKind.Server:
                return(nameof(HubKind.Server));

            case HubKind.ReceiveServer:
                return(nameof(HubKind.ReceiveServer));

            default:
                return(((int)hubKind).ToString());
            }
        }
Beispiel #2
0
        MethodDescriptor FindMethod(HubKind hubType, short hubId, byte operationCode)
        {
            HubDescriptor hubDescriptor;

            if (!hubs.TryGetValue(Tuple.Create(hubType, hubId), out hubDescriptor))
            {
                return(null);
            }
            if (!hubDescriptor.CanExecute)
            {
                return(null);
            }

            MethodDescriptor methodDescriptor;

            if (!hubDescriptor.TryGetMethod(operationCode, out methodDescriptor))
            {
                return(null);
            }

            return(methodDescriptor);
        }
Beispiel #3
0
        // Routing -> ParameterBinding -> Execute
        public async Task ProcessRequest(HubKind hubType, IPhotonWirePeer peer, OperationRequest operationRequest, SendParameters sendParameters)
        {
            // must don't throw error, all code return response
            var appName          = PhotonWireApplicationBase.Instance.ApplicationName;
            var requestStopwatch = Stopwatch.StartNew();

            Interlocked.Increment(ref runningCount);
            try
            {
                var now = DateTime.Now;

                var    useSerializer = this.serializer;
                object serializerObject;
                // PhotonWire.HubInvoker use only Json, flag is embeded.
                if (peer.Items.TryGetValue("PhotonWireApplicationBase.ModifySerializer", out serializerObject))
                {
                    useSerializer = (IPhotonSerializer)serializerObject;
                }

                // Routing

                object hubIdObject;
                if (!operationRequest.Parameters.TryGetValue(ReservedParameterNo.RequestHubId, out hubIdObject) && (Convert.GetTypeCode(hubIdObject) != TypeCode.Int16))
                {
                    PhotonWireApplicationBase.Instance.Logger.RequiredParameterNotFound(appName, ReservedParameterNo.RequestHubId);
                    return;
                }
                object messageIdObject;
                if (!operationRequest.Parameters.TryGetValue(ReservedParameterNo.MessageId, out messageIdObject) && (Convert.GetTypeCode(messageIdObject) != TypeCode.Int32))
                {
                    PhotonWireApplicationBase.Instance.Logger.RequiredParameterNotFound(appName, ReservedParameterNo.MessageId);
                    return;
                }

                var hubId         = (short)hubIdObject;
                var messageId     = (int)messageIdObject;
                var operationCode = operationRequest.OperationCode;

                var parameters = new Dictionary <byte, object>();
                parameters[ReservedParameterNo.RequestHubId] = hubId;
                parameters[ReservedParameterNo.MessageId]    = messageId;
                var operationResponse = new OperationResponse()
                {
                    OperationCode = operationCode, // return same code:)
                    Parameters    = parameters
                };

                try
                {
                    var methodDescriptor = FindMethod(hubType, hubId, operationCode);
                    if (methodDescriptor == null)
                    {
                        throw new InvalidOperationException($"methodDescriptor is null, hubType:{hubType} hubid:{hubId} operationCode:{operationCode}");
                    }
                    var context = new OperationContext(methodDescriptor.Hub, methodDescriptor, peer, operationRequest, sendParameters, now);

                    // Parameter Binding
                    var methodparameters = ParameterBinder.BindParameter(useSerializer, context);
                    context.Parameters = methodparameters;

                    // Execute
                    var hubTypeString = hubType.FastToString();
                    var isError       = true;
                    try
                    {
                        PhotonWireApplicationBase.Instance.Logger.ExecuteStart(appName, hubTypeString, hubId, methodDescriptor.Hub.HubName, operationCode, methodDescriptor.MethodName);
                        var result = await methodDescriptor.Execute(context);

                        context.SendOperation(messageId, result, null, false, useSerializer, null);
                        isError = false;
                    }
                    finally
                    {
                        requestStopwatch.Stop();
                        PhotonWireApplicationBase.Instance.Logger.ExecuteFinished(appName, hubTypeString, hubId, methodDescriptor.Hub.HubName, operationCode, methodDescriptor.MethodName, isError, requestStopwatch.Elapsed.TotalMilliseconds);
                    }
                }
                catch (CustomErrorException ex)
                {
                    var context = new OperationContext(hubId, peer, operationRequest, sendParameters, now);
                    context.SendOperation(messageId, ex.Parameter, ex.ErrorMessage, true, null, ex.ReturnCode);
                }
                catch (Exception ex)
                {
                    var context = new OperationContext(hubId, peer, operationRequest, sendParameters, now);
                    context.SendOperation(messageId, null, enableExceptionReturnDebugError ? ex.ToString() : null, true, useSerializer, null);
                    PhotonWireApplicationBase.Instance.Logger.UnhandledException(appName, ex.GetType().Name, ex.Message, ex.StackTrace);
                }
            }
            finally
            {
                Interlocked.Decrement(ref runningCount);
                Interlocked.Increment(ref completeCount);
            }
        }