Ejemplo n.º 1
0
        public object BeforeCall(string operationName, object[] inputs)
        {
            var item = new WorkItem
            {
                CounterType = OperationState.BeforeCall,
                Action      = GetActionName(operationName)
            };

            _worker.QueueWorkItem(item);

            var stopWatch = Stopwatch.StartNew();

            var callInfo = new ServiceCallInfo
            {
                StopWatch = stopWatch
            };

            return(callInfo);
        }
Ejemplo n.º 2
0
        private async Task <ServiceCallResult> CallNext(INodeClientContainer nodeClientContainer, ServiceCallInfo info, Dictionary <string, string> crossProcessBag, ITrace trace)
        {
            if (info.Attachments == null)
            {
                info.Attachments = new Dictionary <string, byte[]>();
            }

            info.Attachments.Add(Constants.CrossProcessBagKey, await serializer.SerializeAsync(crossProcessBag));

            try
            {
                return(await Next.CallAsync(nodeClientContainer, info));
            }
            catch (Exception ex)
            {
                trace.AnnotateWith(PredefinedTag.Error, ex.Message);
                throw ex;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 调用服务
        /// </summary>
        /// <param name="nodeClientContainer">NodeClient容器</param>
        /// <param name="info">服务调用信息</param>
        /// <returns></returns>
        public async override Task <ServiceCallResult> CallAsync(INodeClientContainer nodeClientContainer, ServiceCallInfo info)
        {
            if (Next == null)
            {
                return(null);
            }

            int callCount = 0;
            NetworkException exception;

            do
            {
                try
                {
                    return(await Next.CallAsync(nodeClientContainer, info));
                }
                catch (NetworkException ex)
                {
                    callCount++;
                    exception = ex;
                }
            } while (callCount < nodeClientContainer.Count);

            throw exception;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 服务追踪
        /// </summary>
        /// <param name="nodeClientContainer"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        public async override Task <ServiceCallResult> CallAsync(INodeClientContainer nodeClientContainer, ServiceCallInfo info)
        {
            string name;

            if (!string.IsNullOrEmpty(info.ServiceName) && !string.IsNullOrEmpty(info.ActionName))
            {
                name = $"Proxy:{info.ServiceName}.{info.ActionName}({info.ServiceId.ToString()}.{info.ActionId.ToString()})";
            }
            else
            {
                name = $"Proxy:{info.ServiceId.ToString()}.{info.ActionId.ToString()}";
            }

            var crossProcessBag = new Dictionary <string, string>();

            if (ServiceContext.Current == null)
            {
                using (var trace = new StartClientTrace(name))
                {
                    TraceContextPropagation.PropagateTraceIdOnto(crossProcessBag);
                    return(await CallNext(nodeClientContainer, info, crossProcessBag, trace));
                }
            }
            else
            {
                using (var trace = new LocalTrace(name))
                {
                    TraceContextPropagation.PropagateTraceIdOnto(crossProcessBag);
                    return(await CallNext(nodeClientContainer, info, crossProcessBag, trace));
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 调用服务
        /// </summary>
        /// <param name="nodeClientContainer">NodeClient容器</param>
        /// <param name="info">服务调用信息</param>
        /// <returns></returns>
        public override Task <ServiceCallResult> CallAsync(INodeClientContainer nodeClientContainer, ServiceCallInfo info)
        {
            var nodeClient = nodeClientContainer.Get(info.ServiceId, info.ActionId, info.ParamList, info.ReturnType, info.Attachments);

            if (nodeClient == null)
            {
                throw new InvalidOperationException("Not found connected NodeClient.");
            }

            return(nodeClient.CallServiceAsync(info.ServiceId, info.ActionId, info.ParamList, info.ReturnType, info.Timeout, info.Attachments));
        }