コード例 #1
0
        public override async Task <TResponse> UnaryServerHandler <TRequest, TResponse>(TRequest request,
                                                                                        ServerCallContext context, UnaryServerMethod <TRequest, TResponse> continuation)
        {
            var trace = context.RequestHeaders.FirstOrDefault(q => q.Key == Consts.TraceId);

            if (trace == null)
            {
                trace = new Metadata.Entry(Consts.TraceId, Guid.NewGuid().ToString());
                context.RequestHeaders.Add(trace);
            }
            var model = new MonitorModel
            {
                ClientIp    = context.Peer,
                RequestUrl  = context.Method,
                RequestData = request?.ToJson(),
                TraceId     = trace.Value
            };

            try
            {
                var result = await continuation(request, context);

                model.Status = "ok";

                model.ResponseData = MonitorManager.Instance.SaveResponseMethodEnable(context.Method) ? result?.ToJson() : Consts.NotResponseMsg;

                return(result);
            }
            catch (Exception ex)
            {
                if (ex is AggregateException aex)
                {
                    foreach (var e in aex.Flatten().InnerExceptions)
                    {
                        model.Exception += e?.ToString() + Environment.NewLine;
                    }
                }
                else
                {
                    model.Exception = ex?.ToString();
                }

                model.Status = "error";
                LoggerAccessor.Instance.LoggerError?.Invoke(new Exception(model.Exception));
                throw CommonError.BuildRpcException(ex);
            }
            finally
            {
                model.ResponseTime = DateTime.Now;
                LoggerAccessor.Instance.LoggerMonitor?.Invoke(model.ToJson());
            }
        }
コード例 #2
0
        private async Task <TResponse> Monitor <TRequest, TResponse>(object request,
                                                                     ServerCallContext context, Delegate continuation, object response = null)
        {
            var trace = context.RequestHeaders.FirstOrDefault(q => q.Key == Consts.TraceId);

            if (trace == null)
            {
                trace = new Metadata.Entry(Consts.TraceId, Guid.NewGuid().ToString());
                context.RequestHeaders.Add(trace);
            }
            var model = new MonitorModel
            {
                ClientIp   = context.Peer,
                RequestUrl = context.Method,
                //RequestData = request?.ToJson(),
                TraceId = trace.Value
            };

            if (request is TRequest)
            {
                model.RequestData = request?.ToJson();
            }
            else if (request is IAsyncStreamReader <TRequest> )
            {
                var requests = new List <TRequest>();
                //await requestStream.ForEachAsync(req=> {
                //    requests.Add(req);
                //    return Task.CompletedTask;
                //});
                model.RequestData = requests?.ToJson();
            }
            try
            {
                if (response == null)
                {
                    var result = await(continuation.DynamicInvoke(request, context) as Task <TResponse>);
                    model.Status = "ok";

                    model.ResponseData = MonitorManager.Instance.SaveResponseMethodEnable(context.Method) ? result?.ToJson() : Consts.NotResponseMsg;

                    return(result);
                }
                else
                {
                    await(continuation.DynamicInvoke(request, context) as Task);
                    return(default(TResponse));
                }
            }
            catch (Exception ex)
            {
                if (ex is AggregateException aex)
                {
                    foreach (var e in aex.Flatten().InnerExceptions)
                    {
                        model.Exception += e?.ToString() + Environment.NewLine;
                    }
                }
                else
                {
                    model.Exception = ex?.ToString();
                }

                model.Status = "error";
                LoggerAccessor.Instance.LoggerError?.Invoke(new Exception(model.Exception));
                throw CommonError.BuildRpcException(ex);
            }
            finally
            {
                model.ResponseTime = DateTime.Now;
                LoggerAccessor.Instance.LoggerMonitor?.Invoke(model.ToJson());
            }
        }
コード例 #3
0
        private async Task <TResponse> Monitor <TRequest, TResponse>(object request,
                                                                     ServerCallContext context, Delegate continuation, object response = null)
        {
            ServerCallContextAccessor.Current = context;
            var trace = context.RequestHeaders.FirstOrDefault(q => q.Key == Consts.TraceId);

            if (trace == null)
            {
                trace = new Metadata.Entry(Consts.TraceId, Guid.NewGuid().ToString());
                context.RequestHeaders.Add(trace);
            }
            var model = new MonitorModel
            {
                ClientIp   = context.Peer,
                RequestUrl = context.Method,
                //RequestData = request?.ToJson(),
                RequestHeaders = context.RequestHeaders.ToDictionary(p => p.Key, p => p.Value),
                TraceId        = trace.Value
            };

            if (request is TRequest)
            {
                model.RequestData = request?.ToJson();
            }
            else if (request is IAsyncStreamReader <TRequest> )
            {
                var requests = new List <TRequest>();
                //await requestStream.ForEachAsync(req=> {
                //    requests.Add(req);
                //    return Task.CompletedTask;
                //});
                model.RequestData = requests?.ToJson();
            }
            try
            {
                if (response == null)
                {
                    var result = await(continuation.DynamicInvoke(request, context) as Task <TResponse>);
                    model.Status = "ok";

                    model.ResponseData = MonitorManager.Instance.SaveResponseMethodEnable(context.Method) ? result?.ToJson() : ServerConsts.NotResponseMsg;

                    return(result);
                }
                else
                {
                    await(continuation.DynamicInvoke(request, response, context) as Task);
                    return(default(TResponse));
                }
            }
            catch (Exception ex)
            {
                var rpcEx       = CommonError.BuildRpcException(ex);
                var dataRequest = rpcEx.Data["Request"];
                if (dataRequest != null)
                {
                    model.Items.TryAdd("ClientRequest", dataRequest);
                    rpcEx.Data["Request"] = model;
                }
                else
                {
                    rpcEx.Data.Add("Request", model);
                }
                model.Exception = rpcEx.ToString();
                model.Status    = "error";
                LoggerAccessor.Instance.OnLoggerError(rpcEx);
                throw rpcEx;
            }
            finally
            {
                ServerCallContextAccessor.Current = null;
                model.ResponseTime = DateTime.Now;
                LoggerAccessor.Instance.OnLoggerMonitor(model.ToJson());
            }
        }