protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var apiLogEntry = _apiLogHelper.CreateApiLogEntryWithRequestData(request); if (apiLogEntry == null) { return(await base.SendAsync(request, cancellationToken)); } if (request.Content != null) { await request.Content.ReadAsStringAsync().ContinueWith(task => { apiLogEntry.RequestContentBody = task.Result; }, cancellationToken); } return(await base.SendAsync(request, cancellationToken).ContinueWith(task => { var response = task.Result; // Update the API log entry with response info apiLogEntry.ResponseStatusCode = (int)response.StatusCode; apiLogEntry.ResponseTimestamp = DateTime.UtcNow; apiLogEntry.TotalExecutionSeconds = (apiLogEntry.ResponseTimestamp.Value - apiLogEntry.RequestTimestamp.Value).TotalSeconds; if (response.Content != null) { apiLogEntry.ResponseContentBody = response.Content.ReadAsStringAsync().Result; apiLogEntry.ResponseContentType = response.Content.Headers.ContentType.MediaType; apiLogEntry.ResponseHeaders = _apiLogHelper.SerializeHeaders(response.Content.Headers); } // TODO: Save the API log entry to the database var trace = GlobalConfiguration.Configuration.Services.GetTraceWriter(); if (trace == null) { return response; } trace.Info(request, _module, "JSON", apiLogEntry); return response; }, cancellationToken)); }