Пример #1
0
        private async Task <object> UnwrapTaskResultAsync(FieldContext fieldContext, Task task)
        {
            if (!task.IsCompleted)
            {
                await task;
            }
            switch (task.Status)
            {
            case TaskStatus.Faulted:
                Exception origExc = task.Exception;
                if (origExc is AggregateException aex)
                {
                    origExc = aex.InnerException; //we expect just one exc (we ignore exc.InnerExceptions list)
                }
                fieldContext.AddError(origExc, ErrorCodes.ResolverError);
                Fail();
                return(null);

            case TaskStatus.RanToCompletion:
                var result = fieldContext.FieldDef.Resolver.TaskResultReader(task);
                return(result);

            case TaskStatus.Canceled:
            default:
                var msg = "Resolver execution canceled.";
                fieldContext.AddError(msg, ErrorCodes.Cancelled);
                throw new ResolverException(msg);
            }
        }
Пример #2
0
 private async Task <object> InvokeResolverAsync(FieldContext fieldContext)
 {
     try {
         if (fieldContext.ResolverClassInstance == null)
         {
             AssignResolverClassInstance(fieldContext);
         }
         if (fieldContext.ArgValues == null)
         {
             BuildResolverArguments(fieldContext);
         }
         // we might have encountered errors when evaluating args; if so, abort all
         this.AbortIfFailed();
         // set current parentEntity arg
         if (fieldContext.Flags.IsSet(FieldFlags.HasParentArg))
         {
             fieldContext.ArgValues[1] = fieldContext.CurrentScope.Entity;
         }
         var resolver = fieldContext.FieldDef.Resolver;
         var result   = resolver.Method.Invoke(fieldContext.ResolverClassInstance, fieldContext.ArgValues);
         if (fieldContext.Flags.IsSet(FieldFlags.ReturnsTask))
         {
             result = await UnwrapTaskResultAsync(fieldContext, (Task)result);
         }
         Interlocked.Increment(ref _requestContext.Metrics.ResolverCallCount);
         // Note: result might be null, but batched result might be set.
         return(result);
     } catch (TargetInvocationException tex) {
         // sync call goes here
         var origExc = tex.InnerException;
         if (origExc is AbortRequestException)
         {
             throw origExc;
         }
         fieldContext.AddError(origExc, ErrorCodes.ResolverError);
         Fail();
         return(null); //never happens
     } catch (AbortRequestException) {
         throw;
     } catch (Exception ex) {
         fieldContext.AddError(ex, ErrorCodes.ResolverError);
         Fail();
         return(null); //never happens
     }
 }
Пример #3
0
 private object InvokeFieldReader(FieldContext fieldContext, object parent)
 {
     try {
         var reader = fieldContext.FieldDef.Reader;
         var result = reader(parent);
         return(result);
     } catch (TargetInvocationException tex) {
         // sync call goes here
         var origExc = tex.InnerException ?? tex;
         fieldContext.AddError(origExc, ErrorCodes.ResolverError);
         throw new AbortRequestException();
     }
 }
Пример #4
0
        public void AddError(FieldContext fieldContext, Exception ex, string errorType)
        {
            _failed = true;
            // fire event
            var eventArgs = new OperationErrorEventArgs(_requestContext, this._mappedOpField.Field, ex);

            _requestContext.Server.Events.OnOperationError(eventArgs);
            if (eventArgs.Exception == null)
            {
                return; // event handler cleared error
            }
            // add error
            fieldContext.AddError(ex, errorType);
        }