private async Task UpdateRetryStatusForMessageAsync(MessagingContext ctx, SendResult result) { if (ctx.MessageEntityId.HasValue) { using (DatastoreContext db = _createDatastore()) { var repository = new DatastoreRepository(db); var service = new MarkForRetryService(repository); service.UpdateAS4MessageForSendResult( messageId: ctx.MessageEntityId.Value, status: result); await db.SaveChangesAsync() .ConfigureAwait(false); } } if (ctx.AS4Message?.IsPullRequest == true) { using (DatastoreContext db = _createDatastore()) { var service = new PiggyBackingService(db); service.ResetSignalMessagesToBePiggyBacked(ctx.AS4Message.SignalMessages, result); await db.SaveChangesAsync() .ConfigureAwait(false); } } }
/// <summary> /// Handle the given <paramref name="response" />, but delegate to the next handler if you can't. /// </summary> /// <param name="response"></param> /// <returns></returns> public async Task <StepResult> HandleResponse(IAS4Response response) { if (response == null) { throw new ArgumentNullException(nameof(response)); } MessagingContext request = response.OriginalRequest; if (request?.AS4Message?.IsPullRequest == true) { bool pullRequestWasPiggyBacked = request.AS4Message.SignalMessages.Any(s => !(s is PullRequest)); if (pullRequestWasPiggyBacked) { using (DatastoreContext ctx = _createContext()) { SendResult result = response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.OK ? SendResult.Success : SendResult.RetryableFail; var service = new PiggyBackingService(ctx); service.ResetSignalMessagesToBePiggyBacked(request.AS4Message.SignalMessages, result); await ctx.SaveChangesAsync().ConfigureAwait(false); } } bool isEmptyChannelWarning = (response.ReceivedAS4Message?.FirstSignalMessage as Error)?.IsPullRequestWarning == true; if (isEmptyChannelWarning) { request.ModifyContext(response.ReceivedAS4Message, MessagingContextMode.Send); return(StepResult.Success(response.OriginalRequest).AndStopExecution()); } } return(await _nextHandler.HandleResponse(response)); }