/// <summary> /// Process and log the request and associated data /// </summary> private async Task ProcessRequestDataAsync(DataRequestType requestType = DataRequestType.Log) { Guid?sessionIdentifier = null; // Null means it will be automatically created // A cross-domain SID can be specified var sentSessId = (string)Request.Form.sid; // TODO: Maybe validation to ensure SID is not being overwritten if (sentSessId != null) { if (Guid.TryParse(sentSessId, out Guid resultSessGuid)) { // TODO: Possibly note that session used custom ID sessionIdentifier = resultSessGuid; } } var sessionInfo = await CreateOrRetrieveSessionAsync(sessionIdentifier); var currentSession = sessionInfo.Item1; var newSession = sessionInfo.Item2; var eventIdentifier = Guid.NewGuid(); if (requestType.HasFlag(DataRequestType.Log)) { var req = new LogRequest { Identifier = eventIdentifier, SessionIdentifier = currentSession.SessionId, Timestamp = DateTime.Now, RequestType = requestType }; // Get client address var clientAddr = GetClientAddress(); req.OriginAddress = clientAddr; req.KQApiNode = Request.Url; if (requestType.HasFlag(DataRequestType.Hit)) { // Map to Hit request var hitReq = Mapper.Map <HitRequest>(req); // Check if also a web request if (requestType.HasFlag(DataRequestType.Web)) { hitReq.Referrer = Request.Headers.Referrer; // Attempt to get page URL hitReq.PageIdentifier = (string)Request.Query.u // Query string ?? (string)Request.Form.u // Form data ?? Request.Headers.Referrer; // Referrer // Check if FetchScript if (requestType.HasFlag(DataRequestType.FetchScript)) { // Map to FetchScriptRequest var fetchScriptReq = Mapper.Map <FetchScriptRequest>(hitReq); hitReq = fetchScriptReq; } } req = hitReq; } // Tag is not compatible with Hit else if (requestType.HasFlag(DataRequestType.Tag)) { // Log with custom data var tagReq = Mapper.Map <TagRequest>(req); tagReq.Tag = Request.Form.tag; tagReq.ExtraData = Request.Form.data; req = tagReq; } // Redirect is not compatible with Tag or Hit else if (requestType.HasFlag(DataRequestType.Redirect)) { // TODO: Log redirect var redirReq = Mapper.Map <RedirectRequest>(req); // This flag IMPLIES the Web flag if (requestType.HasFlag(DataRequestType.Web)) { // Get target URL and save redirReq.DestinationUrl = Request.Query.t; } req = redirReq; } var dataLoggerService = new DataLoggerService(ServerContext); // Save data using Logger service, on the thread pool var saveDataTask = Task.Factory.StartNew(async() => { await dataLoggerService.SaveLogRequestAsync(req); }); // Custom saving if (req is TagRequest) { var saveTagTask = Task.Factory.StartNew(async() => { await dataLoggerService.SaveTagRequestAsync((TagRequest)req); }); } } }