示例#1
0
        public void Log_Should_Write_To_SystemConsole()
        {
            var requestData  = new RequestData();
            var responseData = new ResponseData();

            _requestLogger.Log(requestData, responseData);

            _systemConsole.Verify(x => x.WriteLine(It.IsAny <string>(), It.IsAny <object[]>()), Times.Exactly(8));
        }
示例#2
0
        public override async Task Invoke(IOwinContext context)
        {
            var requestData   = new RequestData();
            var responseData  = new ResponseData();
            var requestStream = await CreateSeekableStream(context.Request.Body);

            var responseStream = context.Response.Body;

            context.Request.Body = requestStream;

            using (var copyStream = new MemoryStream())
            {
                try
                {
                    context.Response.Body = copyStream;

                    requestData = GetRequestData(context.Request);

                    await Next.Invoke(context);

                    responseData = GetResponseData(context.Response);

                    _requestLogger.Log(requestData, responseData);
                }
                catch (Exception ex)
                {
                    _requestLogger.LogError(requestData, responseData, ex);
                }

                requestStream.Seek(0, SeekOrigin.Begin);
                copyStream.Seek(0, SeekOrigin.Begin);

                await copyStream.CopyToAsync(responseStream);
            }
        }
示例#3
0
        public async Task InvokeAsync(HttpContext context, IRequestLogger logger)
        {
            context.Request.EnableBuffering();
            if (context.Request != null)
            {
                string path        = context.Request.Path;
                var    method      = context.Request.Method;
                var    queryString = context.Request.QueryString.ToString();

                string bodyString;
                using (var reader = new StreamReader(context.Request.Body, Encoding.UTF8, true, 1024, true))
                {
                    bodyString = await reader.ReadToEndAsync();
                }

                context.Request.Body.Seek(0, SeekOrigin.Begin);

                logger.Log(method, path, queryString, bodyString);
            }

            if (_next != null)
            {
                await _next(context);
            }
        }
示例#4
0
        private static Action <NancyContext> GetLogRequestHook(IRequestLogger requestLogger)
        {
            return(ctx =>
            {
                var requestData = ExtractRequestData(ctx.Request);
                var responseData = ExtractResponseData(ctx.Response);

                requestLogger.Log(requestData, responseData);
            });
        }
        public override void OnEndRequest(HttpContextBase context)
        {
            if (ShouldNotLog(context.Request))
            {
                return;
            }

            var requestData  = ExtractRequestData(context.Request);
            var responseData = ExtractResponseData(context.Response);

            _requestLogger.Log(requestData, responseData);
        }
示例#6
0
 /// <summary>
 /// Easy way to log all requests
 /// </summary>
 /// <param name="requestDto"></param>
 protected void OnEachRequest(object requestDto)
 {
     if (this.RequestLogger == null)
     {
         return;
     }
     try
     {
         RequestLogger.Log(this.RequestContext, requestDto);
     }
     catch (Exception ex)
     {
         Log.Error("Error while logging request: " + requestDto.Dump(), ex);
     }
 }
示例#7
0
        /// <summary>
        /// Filter called after each request. Lets you change the response type
        /// </summary>
        /// <param name="requestDto"></param>
        /// <param name="response"></param>
        /// <returns></returns>
        protected object AfterEachRequest <TRequest>(TRequest requestDto, object response)
        {
            if (this.RequestLogger != null)
            {
                try
                {
                    RequestLogger.Log(this.RequestContext, requestDto, response, requestDurationStopwatch.Elapsed);
                }
                catch (Exception ex)
                {
                    Log.Error("Error while logging request: " + requestDto.Dump(), ex);
                }
            }

            return(response.IsErrorResponse() ? response : OnAfterExecute(response)); //only call OnAfterExecute if no exception occured
        }
示例#8
0
        private void Context_EndRequest(object sender, EventArgs e)
        {
            string extension = VirtualPathUtility.GetExtension(this._httpContextProvider.Url.LocalPath);

            if (StaticResourceExtensions.Contains(extension))
            {
                return;
            }

            if (_settingManager.GetContainer <AppSetting>().Contains("RequestLoggingEnabled") &&
                bool.Parse(_settingManager.GetContainer <AppSetting>()["RequestLoggingEnabled"].Value))
            {
                Stopwatch stopwatch = (Stopwatch)_httpContextProvider.Items["Stopwatch"];
                if (stopwatch == null)
                {
                    return;
                }

                stopwatch.Stop();
                TimeSpan   ts         = stopwatch.Elapsed;
                RequestLog requestLog = new RequestLog();
                requestLog.AbsolutePath = _httpContextProvider.Url.AbsolutePath;
                requestLog.BrowserType  = _httpContextProvider.BrowserType;
                requestLog.ClientIP     = _httpContextProvider.ClientIP;

                if (_httpContextProvider.Items.Contains("CountryInfo") && _httpContextProvider.Items["CountryInfo"] != null)
                {
                    requestLog.CountryCode = ((Country)_httpContextProvider.Items["CountryInfo"]).Key;
                }
                requestLog.CreatedBy   = _httpContextProvider.UserName;
                requestLog.Duration    = (int)ts.TotalMilliseconds;
                requestLog.HttpMethod  = _httpContextProvider.HttpMethod;
                requestLog.QueryString = _httpContextProvider.Url.Query;
                requestLog.SessionID   = (string)_httpContextProvider.Items["SessionId"];
                requestLog.UserAgent   = _httpContextProvider.ServerVariables["HTTP_USER_AGENT"];
                _requestLogger.Log(requestLog);
                _httpContextProvider.Items["Stopwatch"]   = null;
                _httpContextProvider.Items["SessionId"]   = null;
                _httpContextProvider.Items["CountryInfo"] = null;
            }
        }
        public async Task <CommandResult> Handle(TCommand command, RequestContext context)
        {
            CommandResult result      = null;
            DateTime      requestDate = DateTime.UtcNow;

            using (logger.BeginScope($"trace-id:{context.TraceId}"))

                try
                {
                    result = await decoratedRequestHandler.Handle(command, context);
                }
                catch (Exception ex)
                {
                    result = new CommandResult(new Failure(Constants.UnhandledException, ex.ToString()));
                }
            finally
            {
                var  commandName = command.GetType().Name;
                bool shouldLog   = logSettings?.ShouldLog(commandName) ?? true;

                if (shouldLog)
                {
                    requestLogger.Log(new RequestLog
                    {
                        Name          = commandName,
                        CorrelationId = context.TraceId,
                        Request       = command,
                        RequestDate   = requestDate,
                        Response      = result,
                        ResponseDate  = DateTime.UtcNow,
                        Result        = result.HasError ? Result.Error : Result.Success
                                        //UserCode = context.CorrelationContext.UserId
                    });
                }
            }

            return(result);
        }
示例#10
0
        public async Task <QueryResult <TResponse> > Handle(TQuery query, RequestContext context)
        {
            QueryResult <TResponse> result = null;
            DateTime requestDate           = DateTime.UtcNow;

            using (logger.BeginScope($"trace-id:{context.TraceId}"))

                try
                {
                    result = await decoratedRequestHandler.Handle(query, context);
                }
                catch (Exception ex)
                {
                    result = new QueryResult <TResponse>(new Failure(Constants.UnhandledException, ex.ToString()));
                }
            finally
            {
                var queryName  = query.GetType().Name;
                var logSetting = logSettings.Settings?.FirstOrDefault(x => x.Name == queryName);

                if (logSetting == null || logSetting.ShouldLog)
                {
                    await requestLogger.Log(new RequestLog
                    {
                        Name          = queryName,
                        CorrelationId = context.TraceId,
                        Request       = logSetting?.LogRequest ?? true ? query : null,
                        RequestDate   = requestDate,
                        Response      = logSetting?.LogResponse ?? true ? result : new { result.Code, result.Errors, result.HasError, result.IsSuccess, result.Message, result.Retry },
                        ResponseDate  = DateTime.UtcNow,
                        Result        = result.HasError ? Result.Error : Result.Success,
                        UserCode      = context.UserId
                    });
                }
            }

            return(result);
        }
示例#11
0
        /// <summary>
        /// Executes a REST request indirectly via a callback function <paramref name="executeCallback"/>,
        /// and using a user-defined callback function <paramref name="responseBuilderCallback"/> for
        /// constructing the resulting <see cref="Response"/> object.
        /// </summary>
        /// <remarks>
        /// The callback method <paramref name="executeCallback"/> is responsible for setting the body
        /// of the request, if any, before executing the request. The callback method returns a string
        /// representation of the body of the final request when available, otherwise returns a string
        /// indicating the body is no longer available (e.g. was sent as a stream, or is binary). The
        /// result is only required for passing as an argument to <see cref="IRequestLogger.Log"/>.
        ///
        /// <para>The Boolean argument to <paramref name="responseBuilderCallback"/> indicates whether
        /// or not an exception was thrown while executing the request. The value is <c>true</c>
        /// if an exception occurred, otherwise <c>false</c>.</para>
        /// </remarks>
        /// <param name="url">The base URI.</param>
        /// <param name="method">The HTTP method to use for the request.</param>
        /// <param name="responseBuilderCallback">A user-specified function used to construct the resulting <see cref="Response"/>
        /// object from the <see cref="HttpWebResponse"/> and a Boolean value specifying whether or not a <see cref="WebException"/>
        /// was thrown during the request. If this value is <c>null</c>, a default method is used to construct
        /// the resulting <see cref="Response"/> object.</param>
        /// <param name="headers">
        /// A collection of custom HTTP headers to include with the request. If the value is
        /// <c>null</c>, no custom headers are added to the HTTP request.
        /// </param>
        /// <param name="queryStringParameters">
        /// A collection of parameters to add to the query string portion of the request URI.
        /// If the value is <c>null</c>, no parameters are added to the query string.
        /// </param>
        /// <param name="settings">
        /// The settings to use for the request. If the value is <c>null</c>, the default settings returned
        /// by <see cref="DefaultRequestSettings"/> will be used for the request.
        /// </param>
        /// <param name="executeCallback"></param>
        /// <returns>Returns a <see cref="Response"/> object containing the HTTP status code, headers,
        /// and body from the REST response.</returns>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="url"/> is <c>null</c>.
        /// <para>-or-</para>
        /// <para>If <paramref name="executeCallback"/> is <c>null</c>.</para>
        /// </exception>
        /// <exception cref="NotSupportedException">If <paramref name="method"/> is not supported by the service.</exception>
        public virtual Response ExecuteRequest(Uri url, HttpMethod method, Func <HttpWebResponse, bool, Response> responseBuilderCallback, Dictionary <string, string> headers, Dictionary <string, string> queryStringParameters, RequestSettings settings, Func <HttpWebRequest, string> executeCallback)
        {
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }
            if (executeCallback == null)
            {
                throw new ArgumentNullException("executeCallback");
            }

            url = _urlBuilder.Build(url, queryStringParameters);

            if (settings == null)
            {
                settings = DefaultRequestSettings;
            }

            return(_retryLogic.Execute(() =>
            {
                Response response;

                var startTime = DateTimeOffset.UtcNow;

                string requestBodyText = null;
                try
                {
                    var req = WebRequest.Create(url) as HttpWebRequest;
                    req.Method = method.ToString();
                    req.ContentType = settings.ContentType;
                    req.Accept = settings.Accept;
                    req.AllowAutoRedirect = settings.AllowAutoRedirect;
                    if (settings.ContentLength > 0 || settings.AllowZeroContentLength)
                    {
                        req.ContentLength = settings.ContentLength;
                    }

                    if (settings.ConnectionLimit != null)
                    {
                        req.ServicePoint.ConnectionLimit = settings.ConnectionLimit.Value;
                    }

                    req.Timeout = (int)settings.Timeout.TotalMilliseconds;

                    if (!string.IsNullOrEmpty(settings.UserAgent))
                    {
                        req.UserAgent = settings.UserAgent;
                    }

                    if (settings.Credentials != null)
                    {
                        req.Credentials = settings.Credentials;
                    }

                    if (headers != null)
                    {
                        foreach (var header in headers)
                        {
                            req.Headers.Add(header.Key, header.Value);
                        }
                    }

                    requestBodyText = executeCallback(req);

                    using (var resp = req.GetResponse() as HttpWebResponse)
                    {
                        if (responseBuilderCallback != null)
                        {
                            response = responseBuilderCallback(resp, false);
                        }
                        else
                        {
                            response = BuildWebResponse(resp);
                        }
                    }
                }
                catch (WebException ex)
                {
                    if (ex.Response == null)
                    {
                        throw;
                    }

                    using (var resp = ex.Response as HttpWebResponse)
                    {
                        if (responseBuilderCallback != null)
                        {
                            response = responseBuilderCallback(resp, true);
                        }
                        else
                        {
                            response = BuildWebResponse(resp);
                        }
                    }
                }
                var endTime = DateTimeOffset.UtcNow;

                // Log the request
                if (_logger != null)
                {
                    _logger.Log(method, url.OriginalString, headers, requestBodyText, response, startTime, endTime, settings.ExtendedLoggingData);
                }

                if (response != null && settings.ResponseActions != null && settings.ResponseActions.ContainsKey(response.StatusCode))
                {
                    var action = settings.ResponseActions[response.StatusCode];
                    if (action != null)
                    {
                        action(response);
                    }
                }

                return response;
            }, settings.Non200SuccessCodes, settings.RetryCount, settings.RetryDelay));
        }
    public Task Invoke(HttpContext context)
    {
        var request = context.Request;

        //启用读取request
        request.EnableBuffering();
        if (!AppConfig.EnableIPDirect && request.Host.Host.MatchInetAddress() && !request.Host.Host.IsPrivateIP())
        {
            context.Response.Redirect("https://www.baidu.com", true);

            //context.Response.StatusCode = 404;
            return(Task.CompletedTask);
        }
        var ip         = context.Connection.RemoteIpAddress !.ToString();
        var path       = HttpUtility.UrlDecode(request.Path + request.QueryString, Encoding.UTF8);
        var requestUrl = HttpUtility.UrlDecode(request.Scheme + "://" + request.Host + path);
        var match      = Regex.Match(path ?? "", CommonHelper.BanRegex);

        if (match.Length > 0)
        {
            RedisHelper.IncrBy("interceptCount");
            RedisHelper.LPush("intercept", new IpIntercepter()
            {
                IP          = ip,
                RequestUrl  = requestUrl,
                Time        = DateTime.Now,
                Referer     = request.Headers[HeaderNames.Referer],
                UserAgent   = request.Headers[HeaderNames.UserAgent],
                Remark      = $"检测到敏感词拦截:{match.Value}",
                Address     = request.Location(),
                HttpVersion = request.Protocol,
                Headers     = request.Headers.ToJsonString()
            });
            context.Response.StatusCode  = 404;
            context.Response.ContentType = "text/html; charset=utf-8";
            return(context.Response.WriteAsync("参数不合法!", Encoding.UTF8));
        }

        if (!context.Session.TryGetValue("session", out _) && !context.Request.IsRobot())
        {
            context.Session.Set("session", 0);
            var referer = context.Request.Headers[HeaderNames.Referer].ToString();
            if (!string.IsNullOrEmpty(referer))
            {
                try
                {
                    new Uri(referer);//判断是不是一个合法的referer
                    if (!referer.Contains(context.Request.Host.Value) && !referer.Contains(new[] { "baidu.com", "google", "sogou", "so.com", "bing.com", "sm.cn" }))
                    {
                        BackgroundJob.Enqueue <IHangfireBackJob>(job => job.UpdateLinkWeight(referer, ip));
                    }
                }
                catch
                {
                    context.Response.StatusCode  = 405;
                    context.Response.ContentType = "text/html; charset=utf-8";
                    return(context.Response.WriteAsync("您的浏览器不支持访问本站!", Encoding.UTF8));
                }
            }
        }

        if (!context.Request.IsRobot())
        {
            if (request.QueryString.HasValue && request.QueryString.Value.Contains("="))
            {
                var q = request.QueryString.Value.Trim('?');
                requestUrl = requestUrl.Replace(q, q.Split('&').Where(s => !s.StartsWith("cid") && !s.StartsWith("uid")).Join("&"));
            }

            _requestLogger.Log(ip, requestUrl, context.Request.Headers[HeaderNames.UserAgent], context.Session.Id);
        }

        if (string.IsNullOrEmpty(context.Session.Get <string>(SessionKey.TimeZone)))
        {
            context.Session.Set(SessionKey.TimeZone, context.Connection.RemoteIpAddress.GetClientTimeZone());
        }

        if (!context.Request.Cookies.ContainsKey(SessionKey.RawIP))
        {
            context.Response.Cookies.Append(SessionKey.RawIP, ip.Base64Encrypt(), new CookieOptions()
            {
                Expires  = DateTimeOffset.Now.AddDays(1),
                SameSite = SameSiteMode.Lax
            });
        }

        return(_next(context));
    }