Exemplo n.º 1
0
        public void OnError(ServerCallInterceptorContext context, Exception error)
        {
            if (context.ServerCallContext.UserState.TryGetValue(VisitMarker, out _))
            {
                return;
            }

            context.ServerCallContext.UserState.Add(VisitMarker, string.Empty);

            var faultOrIgnore = _errorHandler.ProvideFaultOrIgnore(context, error);

            if (!faultOrIgnore.HasValue)
            {
                return;
            }

            var fault = faultOrIgnore.Value;

            var status   = new Status(fault.StatusCode ?? StatusCode.Internal, fault.Message ?? error.Message);
            var metadata = fault.Trailers;

            if (fault.Detail != null)
            {
                if (metadata == null)
                {
                    metadata = new Metadata();
                }

                metadata.Add(CallContext.HeaderNameErrorDetail, _marshallerFactory.SerializeHeader(fault.Detail));
                metadata.Add(CallContext.HeaderNameErrorDetailType, fault.Detail.GetType().GetShortAssemblyQualifiedName());
            }

            throw new RpcException(status, metadata ?? Metadata.Empty, status.Detail);
        }