示例#1
0
            public async ValueTask <RPCResponseMessage> ProcessRequestAsync(RPCRequestMessage request, Guid clientId, MethodDescriptor mDesc, CancellationToken cancellationToken)
            {
                var response            = RPCResponseMessage.Retrieve(request);
                var threadClientIdIndex = Environment.CurrentManagedThreadId % MaxSupportedThreadCounts;

                _threadClientId[threadClientIdIndex] = clientId;
                ConnectionCancellationToken          = cancellationToken;
                var initTime = Stopwatch.GetTimestamp();

                try
                {
                    var results = mDesc.Method(ServiceInstance, request.Parameters);
                    if (mDesc.ReturnIsTask)
                    {
                        var resultTask = (Task)results;
                        await resultTask.ConfigureAwait(false);

                        if (mDesc.ReturnTaskResult != null)
                        {
                            response.ReturnValue = mDesc.ReturnTaskResult.GetValue(resultTask);
                        }
                        else
                        {
                            response.ReturnValue = null;
                        }
                    }
                    else
                    {
                        response.ReturnValue = results;
                    }
                }
                catch (TargetInvocationException ex)
                {
                    Core.Log.Error("Error calling the Method: {0} with Parameters: [{1}], on the Service: {2}", mDesc?.Name, mDesc?.Parameters?.Select(p => p.Name + "(" + p.Type + ")").Join(","), Descriptor?.Name);
                    Core.Log.Error("Trying to call with the following parameters: {0}", request?.Parameters?.Select(s => s?.GetType().FullName ?? "(null)").Join(","));
                    Core.Log.Write(ex);
                    response.Exception = new SerializableException(ex.InnerException);
                }
                catch (Exception ex)
                {
                    Core.Log.Error("Error calling the Method: {0} with Parameters: [{1}], on the Service: {2}", mDesc?.Name, mDesc?.Parameters?.Select(p => p.Name + "(" + p.Type + ")").Join(","), Descriptor?.Name);
                    Core.Log.Error("Trying to call with the following parameters: {0}", request?.Parameters?.Select(s => s?.GetType().FullName ?? "(null)").Join(","));
                    Core.Log.Write(ex);
                    response.Exception = new SerializableException(ex);
                }
                _threadClientId[threadClientIdIndex] = Guid.Empty;
                var execTime = (Stopwatch.GetTimestamp() - initTime) * 1000d / Stopwatch.Frequency;

                mDesc.Counter.Add(execTime);
                return(response);
            }
示例#2
0
        private void ClientOnOnMessageReceived(RpcClient rpcClient1, RPCMessage rpcMessage)
        {
            switch (rpcMessage)
            {
            case RPCResponseMessage responseMessage:
                if (!_messageResponsesHandlers.TryRemove(responseMessage.RequestMessageId, out var value))
                {
                    return;
                }
                value.Message = responseMessage;
                value.Event.Set();
                break;

            case RPCEventMessage eventMessage:
                if (!_previousMessages.TryGetValue(eventMessage.MessageId, out _))
                {
                    _previousMessages.TryAdd(eventMessage.MessageId, null);
                    var edea = EventDataEventArgs.Retrieve(eventMessage.ServiceName, eventMessage.EventName, eventMessage.EventArgs);
                    OnEventReceived?.Invoke(this, edea);
                    EventDataEventArgs.Store(edea);
                }
                break;

            case RPCPushMessage pushMessage:
                if (!_previousMessages.TryGetValue(pushMessage.MessageId, out _))
                {
                    _previousMessages.TryAdd(pushMessage.MessageId, null);
                    var evArgs = ReferencePool <EventArgs <RPCPushMessage> > .Shared.New();

                    evArgs.Item1 = pushMessage;
                    OnPushMessageReceived?.Invoke(this, evArgs);
                    evArgs.Item1 = null;
                    ReferencePool <EventArgs <RPCPushMessage> > .Shared.Store(evArgs);
                }
                break;

            case RPCError errorMessage:
                var respMsg = RPCResponseMessage.Retrieve(errorMessage);
                foreach (var mHandler in _messageResponsesHandlers.ToArray())
                {
                    mHandler.Value.Message = respMsg;
                    mHandler.Value.Event.Set();
                    _messageResponsesHandlers.TryRemove(mHandler.Key, out _);
                }
                break;
            }
        }
示例#3
0
            public RPCResponseMessage ProcessRequest(RPCRequestMessage request, Guid clientId, MethodDescriptor mDesc, CancellationToken cancellationToken)
            {
                var response = RPCResponseMessage.Retrieve(request);

                try
                {
                    lock (_threadClientId) _threadClientId[Environment.CurrentManagedThreadId] = clientId;
                    ConnectionCancellationToken = cancellationToken;
                    var results = mDesc.Method(ServiceInstance, request.Parameters);
                    if (results is Task resultTask)
                    {
                        resultTask.WaitAsync();
                        var type = results.GetType();
                        if (type.GenericTypeArguments.Length > 0)
                        {
                            var resultProperty = TaskResultsProperties.GetOrAdd(results.GetType(), mType => mType.GetProperty("Result").GetFastPropertyInfo());
                            response.ReturnValue = resultProperty.GetValue(resultTask);
                        }
                        else
                        {
                            response.ReturnValue = null;
                        }
                    }
                    else
                    {
                        response.ReturnValue = results;
                    }
                }
                catch (TargetInvocationException ex)
                {
                    Core.Log.Error("Error calling the Method: {0} with Parameters: [{1}], on the Service: {2}", mDesc?.Name, mDesc?.Parameters?.Select(p => p.Name + "(" + p.Type + ")").Join(","), Descriptor?.Name);
                    Core.Log.Error("Trying to call with the following parameters: {0}", request?.Parameters?.Select(s => s?.GetType().FullName ?? "(null)").Join(","));
                    Core.Log.Write(ex);
                    response.Exception = new SerializableException(ex.InnerException);
                }
                catch (Exception ex)
                {
                    Core.Log.Error("Error calling the Method: {0} with Parameters: [{1}], on the Service: {2}", mDesc?.Name, mDesc?.Parameters?.Select(p => p.Name + "(" + p.Type + ")").Join(","), Descriptor?.Name);
                    Core.Log.Error("Trying to call with the following parameters: {0}", request?.Parameters?.Select(s => s?.GetType().FullName ?? "(null)").Join(","));
                    Core.Log.Write(ex);
                    response.Exception = new SerializableException(ex);
                }
                return(response);
            }
        private void ClientOnOnMessageReceived(RpcClient rpcClient1, RPCMessage rpcMessage)
        {
            switch (rpcMessage)
            {
            case RPCResponseMessage responseMessage:
                if (!_messageResponsesHandlers.TryRemove(responseMessage.RequestMessageId, out var value))
                {
                    return;
                }
                value.Message = responseMessage;
                value.Event.Set();
                break;

            case RPCEventMessage eventMessage:
                _previousMessages.GetOrAdd(eventMessage.MessageId, mId =>
                {
                    OnEventReceived?.InvokeAsync(this, new EventDataEventArgs(eventMessage.ServiceName, eventMessage.EventName, eventMessage.EventArgs));
                    return(null);
                });
                break;

            case RPCPushMessage pushMessage:
                _previousMessages.GetOrAdd(pushMessage.MessageId, mId =>
                {
                    OnPushMessageReceived?.InvokeAsync(this, new EventArgs <RPCPushMessage>(pushMessage));
                    return(null);
                });
                break;

            case RPCError errorMessage:
                var respMsg = new RPCResponseMessage {
                    Exception = errorMessage.Exception
                };
                foreach (var mHandler in _messageResponsesHandlers.ToArray())
                {
                    mHandler.Value.Message = respMsg;
                    mHandler.Value.Event.Set();
                    _messageResponsesHandlers.TryRemove(mHandler.Key, out var _);
                }
                break;
            }
        }