private DomainService GetDomainService(object instance, WcfDomainServiceContext context)
        {
            // create and initialize the DomainService for this request
            DomainServiceBehavior.DomainServiceInstanceInfo instanceInfo =
                (DomainServiceBehavior.DomainServiceInstanceInfo)instance;

            try
            {
                DomainService domainService = DomainService.Factory.CreateDomainService(instanceInfo.DomainServiceType, context);
                instanceInfo.DomainServiceInstance = domainService;
                return(domainService);
            }
            catch (TargetInvocationException tie)
            {
                if (tie.InnerException != null)
                {
                    throw ServiceUtility.CreateFaultException(tie.InnerException, context.DisableStackTraces);
                }

                throw ServiceUtility.CreateFaultException(tie, context.DisableStackTraces);
            }
            catch (Exception ex)
            {
                if (ex.IsFatal())
                {
                    throw;
                }
                throw ServiceUtility.CreateFaultException(ex, context.DisableStackTraces);
            }
        }
        private async ValueTask <object> InvokeAsync(object instance, object[] inputs)
        {
            long startTicks         = DiagnosticUtility.GetTicks();
            bool disableStackTraces = true;
            var  operationContext   = OperationContext.Current;

            try
            {
                WcfDomainServiceContext context = new WcfDomainServiceContext((IServiceProvider)operationContext.Host, this.operationType);
                disableStackTraces = context.DisableStackTraces;

                DiagnosticUtility.OperationInvoked(this.Name, operationContext);
                DomainService domainService = this.GetDomainService(instance, context);

                // invoke the operation and process the result
                this.ConvertInputs(inputs);
                var result = await this.InvokeCoreAsync(domainService, inputs, disableStackTraces).ConfigureAwait(false);

                result = this.ConvertReturnValue(result);

                DiagnosticUtility.OperationCompleted(this.Name, DiagnosticUtility.GetDuration(startTicks), operationContext);

                return(result);
            }
            catch (FaultException)
            {
                DiagnosticUtility.OperationFaulted(this.Name, DiagnosticUtility.GetDuration(startTicks), operationContext);

                // if the exception has already been transformed to a fault
                // just rethrow it
                throw;
            }
            catch (Exception ex)
            {
                if (ex.IsFatal())
                {
                    throw;
                }
                DiagnosticUtility.OperationFailed(this.Name, DiagnosticUtility.GetDuration(startTicks), operationContext);

                // We need to ensure that any time an exception is thrown by the
                // service it is transformed to a properly sanitized/configured
                // fault exception.
                throw ServiceUtility.CreateFaultException(ex, disableStackTraces);
            }
        }