示例#1
0
        private void ReturnInner <T>(RpcResponseHeader response, T results)
        {
            try {
                if (Interlocked.CompareExchange(ref _hasReturned, 1, 0) != 0)
                {
                    string msg = string.Format("Return more than once <{0}.{1}>", this.ServiceName, this.MethodName);
                    throw new NotSupportedException(msg);
                }

                TracingManager.Info(
                    delegate() {
                    _observer.ResponseTracer.InfoFmt2(
                        _request.FromService + "@" + _request.FromComputer,
                        _request.ToUri,
                        "Args={0}\r\nResults={1}",
                        ObjectHelper.DumpObject(_args),
                        ObjectHelper.DumpObject(results)
                        );
                }
                    );

                _trans.SendResponse(response, results);
                _observer.Track(true, response.Error, (int)_watch.ElapsedMilliseconds);
            } catch (Exception innerEx) {
                SystemLog.Error(LogEventID.RpcFailed, innerEx, "RpcServerContext.ReturnError Failed");
            } finally {
                _perfCounters.ConcurrentContext.Decrement();
                _perfCounters.InvokeFailed.Increment();
            }
        }
示例#2
0
        private void ReturnError(RpcResponseHeader response)
        {
            try {
                if (Interlocked.CompareExchange(ref _hasReturned, 1, 0) != 0)
                {
                    string msg = string.Format("Return more than once <{0}.{1}> ex={2}", this.ServiceName, this.MethodName, response.Error);
                    throw new NotSupportedException(msg);
                }

                _observer.ResponseTracer.ErrorFmt2(
                    response.Error,
                    _request.FromService + "@" + _request.FromComputer,
                    _request.ToUri,
                    "Args={0}",
                    ObjectHelper.DumpObject(_args)
                    );

                _trans.SendError(response);

                _observer.Track(false, response.Error, _watch.ElapsedTicks);
            } catch (Exception innerEx) {
                SystemLog.Error(LogEventID.RpcFailed, innerEx, "RpcServerContext.ReturnError Failed");
            } finally {
                _perfCounters.ConcurrentContext.Decrement();
                _perfCounters.InvokeFailed.Increment();
            }
        }
        protected virtual void OnExecute(IClientContext client, Stream input, Stream output)
        {
            RpcRequestHeader requestHeader = RpcRequestHeader.DefaultInstance;

            RpcResponseHeader.Builder responseHeader = RpcResponseHeader.CreateBuilder();
            try
            {
                requestHeader = RpcRequestHeader.ParseDelimitedFrom(input, ExtensionRegistry);
                responseHeader.SetMessageId(requestHeader.MessageId);

                IMessageLite responseBody = OnExecute(client, requestHeader, CodedInputStream.CreateInstance(input),
                                                      responseHeader);

                responseHeader.Build().WriteDelimitedTo(output);
                responseBody.WriteTo(output);
            }
            catch (Exception ex)
            {
                OnException(requestHeader, responseHeader, ex);
                responseHeader.Build().WriteDelimitedTo(output);
            }
        }
示例#4
0
        protected virtual void CallService(RpcRequestHeader requestHeader, IMessageLite requestBody,
                                           out RpcResponseHeader responseHeader, out Stream responseBody)
        {
            byte[] requestBytes;
            using (MemoryStream input = new MemoryStream(1024))
            {
                requestHeader.WriteDelimitedTo(input);
                requestBody.WriteTo(input);
                requestBytes = input.ToArray();
            }

            Stream output = Execute(requestBytes);

            try
            {
                responseHeader = RpcResponseHeader.ParseDelimitedFrom(output, ExtensionRegistry);
                responseBody   = output;
            }
            catch
            {
                output.Dispose();
                throw;
            }
        }
示例#5
0
        public void ThrowException(Exception ex)
        {
            var response = RpcResponseHeader.CreateError(RpcErrorCode.ServerError, ex);

            ReturnError(response);
        }
示例#6
0
        public void ReturnError(RpcErrorCode errCode, Exception ex)
        {
            var response = RpcResponseHeader.CreateError(errCode, ex);

            ReturnError(response);
        }
示例#7
0
        public void Return <T>(T results)
        {
            var response = RpcResponseHeader.CreateSuccess(results != null);

            ReturnInner <T>(response, results);
        }
示例#8
0
        public void Return()
        {
            var response = RpcResponseHeader.CreateSuccess(false);

            ReturnInner <RpcNull>(response, null);
        }
示例#9
0
 private void ProcessResponse(RpcResponseHeader response, long costTicks)
 {
     _response = response;
     _observer.Track(response.ErrorCode == RpcErrorCode.OK, response.Error, costTicks);
     _callback(this);
 }
示例#10
0
 protected virtual void OnException(RpcRequestHeader requestHeader, RpcResponseHeader.Builder responseHeader,
                                    Exception exception)
 {
     responseHeader.SetSuccess(false);
     responseHeader.ClearContentLength();
     responseHeader.SetException(RpcExceptionInfo.Create(exception, _exceptionDetails));
 }
示例#11
0
        public virtual IMessageLite OnExecute(IClientContext client, RpcRequestHeader requestHeader,
                                              CodedInputStream input, RpcResponseHeader.Builder responseHeader)
        {
            RpcCallContext previous = RpcCallContext.g_current;
            try
            {
                responseHeader.SetMessageId(requestHeader.MessageId);
                requestHeader.CallContext.Client = client;
                RpcCallContext.g_current = requestHeader.CallContext;

                IMessageLite responseBody = CallMethod(requestHeader, input);

                if (RpcCallContext.g_current != null && !requestHeader.CallContext.Equals(RpcCallContext.g_current))
                {
                    responseHeader.SetCallContext(RpcCallContext.g_current);
                }

                return responseBody;
            }
            catch (Exception ex)
            {
                OnException(requestHeader, responseHeader, ex);
                return RpcVoid.DefaultInstance;
            }
            finally
            {
                RpcCallContext.g_current = previous;
            }
        }