/// <summary>
        /// Process an individual request and response.
        /// </summary>
        /// <param name="context">The <see cref="IOwinContext"/></param>
        /// <returns><see cref="Task"/></returns>
        public override async Task Invoke(IOwinContext context)
        {
            Guid requestId = Guid.Empty;

            try
            {
                requestId = await _logHandler.LogRequestAsync(context);
            }
            catch (Exception e)
            {
                Trace.WriteLine(e.Message);
            }

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            await _next.Invoke(context);

            var elapsedMilliseconds = stopWatch.ElapsedMilliseconds;

            stopWatch.Stop();

            try
            {
                await _logHandler.LogResponseAsync(context, requestId, elapsedMilliseconds);
            }
            catch (Exception e)
            {
                Trace.WriteLine(e.Message);
            }
        }