Пример #1
0
        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));
        }