To round out the synchronisation processes logging I needed to instrument each Web API called made that formed part of a sync.
This was done in one of two ways. It was either triggered by the client by sending a SyncId in the header or if a SyncId value was present in the users session.
NOTE: its important this method returns a response because if you don’t the Web API response might be a 404 “Not Found” which happened in my first implementation after a logical error in my error handling (stripped from the below example for simplicity).
public class SyncLogHandler : DelegatingHandler { protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { DateTime startTimestamp = DateTime.Now; string clientSyncModel = string.Empty; int clientSyncId = SyncHelper.GetSyncIdFromRequest(request); if ((clientSyncId != 0) && (request.RequestUri.ToString().Contains("login") == false)) { var requestContentByteArray = await request.Content.ReadAsByteArrayAsync(); clientSyncModel = Encoding.UTF8.GetString(requestContentByteArray); } // Call the rest of the pipeline of work var response = await base.SendAsync(request, cancellationToken); // We still call the sync service in case the server believes we are still in sync mode. var syncService = request.GetDependencyScope().GetService(typeof(ISyncService)) as ISyncService; syncService.LogSyncDetail( clientSyncId, request.RequestUri.ToString(), startTimestamp, clientSyncModel, ((int)response.StatusCode).ToString(), HttpContext.Current.Session.SessionID, Thread.CurrentThread.ManagedThreadId, Environment.MachineName ); return response; } }
This is part of a 3 part series on aspects of implementing a synchronisation process with throttling capabilities: