コード例 #1
0
        /// <summary>
        /// Срабатывает при получении запроса.
        /// Заполняет логи, работает с куками и сессиями.
        /// </summary>
        /// <param name="request">Пришедший запрос</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var requestId = new RequestId(Guid.NewGuid()); //установка уникального номера запроса чтобы можно было идентифицировать его при обработке ответа

            request.Properties.Add(Constants.RequestIdKey, requestId);
            LogWriter.AddRequestToLog(ref request, requestId);

            var response = await base.SendAsync(request, cancellationToken);

            byte[] responseMessage = await response.Content.ReadAsByteArrayAsync();

            var responseText = Encoding.UTF8.GetString(responseMessage);

            //обработка куки и сессий
            Guid   sessionGuid  = Guid.NewGuid();
            string ipRemoteUser = request.GetOwinContext().Request.RemoteIpAddress;
            var    cookie       = CookieWorker.GetSessionGuidFromCookies(request.Headers);

            if (cookie != null)
            {
                try
                {
                    sessionGuid = Guid.Parse(cookie[Constants.SessionIdKeyInCookies].Value);
                }
                catch
                {
                    Debug.WriteLine("Не удалось распарсить Guid");
                }
            }

            if (!SessionStore.ContainsKey(sessionGuid))
            {   //возможна ситуация - если получили guid из кук и его не оказалось в коллекции,то guid остаётся тем же и перезаписывается.Очень маловероятная ситуация если отдавать куки со сроком действия
                CookieWorker.AddSessionIdToCookies(sessionGuid, response);

                SessionStore.AddSession(sessionGuid, new Session(
                                            SessionStore.GetTimeOutdateOfSession(),
                                            ipRemoteUser));
            }

            SessionStore.UpdateLastActivity(sessionGuid);
            SessionStore.AddQueryToLastQueries(sessionGuid, request.RequestUri.ToString());

            if (!SessionStore.IsTheSameIp(sessionGuid, ipRemoteUser))
            {
                throw new Exception("Сменился ip на " + ipRemoteUser);
            }

            LogWriter.AddResponseToLogs(requestId.GUID, response.IsSuccessStatusCode, response.StatusCode, responseText);
            //LogStore.WriteContentToOutput();

            return(response);
        }