Ejemplo n.º 1
0
        /// <inheritdoc />
        public override async Task <AsyncInvocationState <TPipeline> > MakeTransitionAsync <TResult>(TPipeline pipeline)
        {
            try
            {
                if (pipeline.FlowBehavior == FlowBehavior.Continue)
                {
                    _interceptionAspect.OnInvoke(pipeline.Invocation);
                    pipeline.CurrentReturnValue = await((Task <TResult>)pipeline.Invocation.ReturnValue)
                                                  .ConfigureAwait(continueOnCapturedContext: false);
                }
                // Нужно пересобрать возвращаемый результат, т.к. метод
                // мы не выполнили, а клиент ждет что-то, на чем можно вызвать await
                else
                {
                    pipeline.Invocation.ReturnValue = pipeline.IsExceptional()
                        ? Task.FromException <TResult>(pipeline.CurrentException)
                        : Task.FromResult((TResult)pipeline.CurrentReturnValue);
                }

                return(new AsyncInvocationStateSyncAdapter <TPipeline>(
                           new SuccessState <TPipeline>(_boundaryAspects)));
            }
            catch (Exception e)
            {
                var innerException = e.GetInnerIf(e is TargetInvocationException && e.InnerException != null);

                pipeline.ContinueFaulted(innerException);

                return(new AsyncInvocationStateSyncAdapter <TPipeline>(
                           new CatchState <TPipeline>(_boundaryAspects)));
            }
        }