示例#1
0
        public async Task Invoke(HttpContext httpContext, ITrafficCometMiddlewaresAccessor trafficCometAccessor,
                                 IDynamicBodyReader dynamicBodyReader, IOptionsSnapshot <RequestReadMiddlewareConfig> config)
        {
            if (trafficCometAccessor == null)
            {
                throw new ArgumentNullException(nameof(trafficCometAccessor));
            }

            if (dynamicBodyReader == null)
            {
                throw new ArgumentNullException(nameof(dynamicBodyReader));
            }

            TrafficCometMiddlewaresAccessor internalTrafficCometAccessor = (TrafficCometMiddlewaresAccessor)trafficCometAccessor;

            internalTrafficCometAccessor.IgnoreRequest = !internalTrafficCometAccessor.IgnoreWholeRequest &&
                                                         config.IgnoreRequest(httpContext.Request.Path);

            if (!internalTrafficCometAccessor.IgnoreRequest)
            {
                MemoryStream originalRequestBody = new MemoryStream();
                await httpContext.Request.Body.CopyToAsync(originalRequestBody);

                originalRequestBody.Position = 0L;

                try
                {
                    httpContext.Request.EnableRewind();
                    using (var buffer = new MemoryStream())
                    {
                        await originalRequestBody.CopyToAsync(buffer);

                        originalRequestBody.Position = 0L;

                        var bodyCompressed = httpContext.RequestBodyIsCompressed(out string compressionType);
                        internalTrafficCometAccessor.RequestBody = dynamicBodyReader
                                                                   .ReadBody(buffer, bodyCompressed, compressionType);
                    }
                }
                catch (Exception ex)
                {
                    if (Logger != null && Logger.IsEnabled(LogLevel.Error))
                    {
                        Logger.LogError(new EventId(90, $"TrafficComet.{nameof(RequestReadMiddleware)}"), ex, ex.ToString());
                    }
                }
                finally
                {
                    httpContext.Request.Body = originalRequestBody;
                }
                await Next(httpContext);
            }
            else
            {
                await Next(httpContext);
            }
        }
示例#2
0
        public async Task Invoke(HttpContext httpContext, ITrafficCometMiddlewaresAccessor trafficCometAccessor,
                                 ITrafficLogWriter logWriter, ITrafficLogFactory logFactory, ITraceIdGenerator traceIdGenerator,
                                 IClientIdGenerator clientUniqueIdGenerator, IOptionsSnapshot <TrafficCometMiddlewareConfig> config)
        {
            if (trafficCometAccessor == null)
            {
                throw new ArgumentNullException(nameof(trafficCometAccessor));
            }

            if (logWriter == null)
            {
                throw new ArgumentNullException(nameof(logWriter));
            }

            if (logFactory == null)
            {
                throw new ArgumentNullException(nameof(logFactory));
            }

            if (traceIdGenerator == null)
            {
                throw new ArgumentNullException(nameof(traceIdGenerator));
            }

            if (clientUniqueIdGenerator == null)
            {
                throw new ArgumentNullException(nameof(clientUniqueIdGenerator));
            }

            TrafficCometMiddlewaresAccessor internalTrafficCometAccessor = (TrafficCometMiddlewaresAccessor)trafficCometAccessor;

            internalTrafficCometAccessor.InitContextValues();
            internalTrafficCometAccessor.ApplicationId      = config.Value.ApplicationId;
            internalTrafficCometAccessor.IgnoreWholeRequest = config.IgnoreRequest(httpContext.Request.Path);

            var clientIdReaded = clientUniqueIdGenerator.TryGenerateClientId(out string clientId);
            var traceIdReaded  = traceIdGenerator.TryGenerateTraceId(out string traceId);

            if (!internalTrafficCometAccessor.IgnoreWholeRequest && clientIdReaded && traceIdReaded)
            {
                BeforeExecuteNextMiddleware(ref internalTrafficCometAccessor, clientId, traceId);
                await Next(httpContext);

                try
                {
                    AfterExecutedNextMiddleware(ref internalTrafficCometAccessor);
                    var ignoreRequest  = internalTrafficCometAccessor.IgnoreRequest;
                    var ignoreResponse = internalTrafficCometAccessor.IgnoreResponse;

                    var log = logFactory.Create();
                    if (log != null)
                    {
                        _ = logWriter.SaveLog(log);
                    }
                }
                catch (Exception ex)
                {
                    if (Logger != null && Logger.IsEnabled(LogLevel.Error))
                    {
                        Logger.LogError(new EventId(92, $"TrafficComet.{nameof(TrafficCometMiddleware)}"), ex, ex.ToString());
                    }
                }
            }
            else
            {
                await Next(httpContext);
            }
        }