Exemplo n.º 1
0
        public byte[] Process(Type serviceInterface, string pathSeparatedBySlashes, string serviceScope, byte[] data, TimeoutSettings timeoutSettings)
        {
            ServicePath path;

            if (!ServicePath.TryParse(pathSeparatedBySlashes, out path))
            {
                throw new InvalidOperationException(string.Format("'{0}' is not a valid service path", pathSeparatedBySlashes));
            }

            var serviceName = serviceInterface.GetServiceName();
            var endPoint    = topology.GetEndPoint(serviceName, serviceScope);
            var sender      = requestSenderContainer.GetSender(endPoint.Protocol);
            var request     = new Request(path, serviceScope, data);

            timeoutSettings = timeoutSettings ?? TimeoutSettings.NoTimeout;

            bool hasNetworkTimeout      = timeoutSettings.MaxMilliseconds != -1 && timeoutSettings.MaxMilliseconds != 0 && timeoutSettings.MaxMilliseconds != int.MaxValue;
            var  startTime              = DateTime.Now;
            int  remainingTriesMinusOne = timeoutSettings.NotReadyRetryCount;

            while (remainingTriesMinusOne >= 0)
            {
                remainingTriesMinusOne--;

                Response response;
                try
                {
                    int?networkTimeout = hasNetworkTimeout ? timeoutSettings.MaxMilliseconds - (DateTime.Now - startTime).Milliseconds : (int?)null;
                    response = sender.Send(endPoint.Host, endPoint.Port, request, networkTimeout);
                }
                catch (TimeoutException ex)
                {
                    throw new ServiceTimeoutException(request, timeoutSettings.MaxMilliseconds, ex);
                }
                catch (Exception ex)
                {
                    throw new ServiceNetworkException(string.Format("Sending a '{0}' request to {1} failed", pathSeparatedBySlashes, endPoint), ex);
                }

                switch (response.Status)
                {
                case ResponseStatus.Ok:
                    return(response.Data);

                case ResponseStatus.NotReady:
                    if (remainingTriesMinusOne >= 0)
                    {
                        Thread.Sleep(timeoutSettings.NotReadyRetryMilliseconds);
                    }
                    break;

                case ResponseStatus.BadRequest:
                    throw new ServiceTopologyException(string.Format("'{0}' seems to be a bad request for {1}",
                                                                     pathSeparatedBySlashes, endPoint));

                case ResponseStatus.ServiceNotFound:
                    throw new ServiceTopologyException(string.Format("'{0}' service was not present at {1}",
                                                                     serviceName, endPoint));

                case ResponseStatus.Exception:
                {
                    Exception remoteException;
                    if (exceptionCodec.TryDecodeSingle(response.Data, out remoteException))
                    {
                        throw remoteException;
                    }
                    throw new ServiceNetworkException(
                              string.Format("'{0}' request caused {1} to return an unknown exception",
                                            pathSeparatedBySlashes, endPoint));
                }

                case ResponseStatus.InternalServerError:
                    throw new Exception(string.Format("'{0}' request caused {1} to encounter an internal server error",
                                                      pathSeparatedBySlashes, endPoint));

                default:
                    throw new ArgumentOutOfRangeException("response.Status");
                }
            }

            throw new ServiceTimeoutException(request, timeoutSettings.NotReadyRetryCount, timeoutSettings.NotReadyRetryMilliseconds);
        }
Exemplo n.º 2
0
        public byte[] Process(Type serviceInterface, string pathSeparatedBySlashes, string serviceScope, byte[] data, TimeoutSettings timeoutSettings)
        {
            ServicePath path;

            if (!ServicePath.TryParse(pathSeparatedBySlashes, out path))
            {
                throw new InvalidOperationException(string.Format("'{0}' is not a valid service path", pathSeparatedBySlashes));
            }

            var serviceName = serviceInterface.GetServiceName();
            var endPoint    = topology.GetEndPoint(serviceName, serviceScope);

            try
            {
                string protocol = endPoint.Protocol.ToLower();

                if (protocol.Equals("http"))
                {
                    return(ProcessAsync(serviceInterface, pathSeparatedBySlashes, serviceScope, data, timeoutSettings).Result);
                }
                else if (protocol.Equals("tcp"))
                {
                    var sender  = requestSenderContainer.GetSender(endPoint.Protocol);
                    var request = new Request(path, serviceScope, data);

                    var response = sender.Send(endPoint.Host, endPoint.Port, request, -1);

                    switch (response.Status)
                    {
                    case ResponseStatus.Ok:
                        return(response.Data);

                    case ResponseStatus.BadRequest:
                        throw new ServiceTopologyException(string.Format("'{0}' seems to be a bad request for {1}",
                                                                         pathSeparatedBySlashes, endPoint));

                    case ResponseStatus.InternalServerError:
                        throw new Exception(string.Format("'{0}' request caused {1} to encounter an internal server error(maybe timeout)",
                                                          pathSeparatedBySlashes, endPoint));

                    case ResponseStatus.Exception:
                    {
                        Exception remoteException;
                        if (exceptionCodec.TryDecodeSingle(response.Data, out remoteException))
                        {
                            throw remoteException;
                        }
                        throw new ServiceNetworkException(
                                  string.Format("'{0}' request caused {1} to return an unknown exception",
                                                pathSeparatedBySlashes, endPoint));
                    }

                    case ResponseStatus.ServiceNotFound:
                        throw new ServiceTopologyException(string.Format("'{0}' service was not present at {1}",
                                                                         serviceName, endPoint));

                    default:
                        throw new Exception(string.Format("'{0}' request caused {1} to return an undefined status '{2}'",
                                                          pathSeparatedBySlashes, endPoint, (int)response.Status));
                    }
                }
                return(null);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerExceptions.Count == 1)
                {
                    throw ex.InnerExceptions[0];
                }
                throw;
            }
        }