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); }
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; } }