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()); } }
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()); } }
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()); } }