public T GetArgs <T>() { try { if (!_request.HasBody) { object a = null; return((T)a); } T ret = _trans.ReceiceRequest <T>(); _args = ret; TracingManager.Info( delegate() { _observer.RequestTracer.InfoFmt2( _request.ServiceAtComputer, _request.ToUri, "Args={0}", ObjectHelper.DumpObject(_args) ); } ); return(ret); } catch (Exception ex) { _observer.RequestTracer.ErrorFmt2( ex, _request.ServiceAtComputer, _request.ToUri, "Args={0}", ObjectHelper.DumpObject(_args) ); throw new RpcException("RpcServerContext.GetArgs", "", RpcErrorCode.InvaildRequestArgs, ex); } }
private DatabaseOperationContext Prepare(string info, string spName, string[] parameters, object[] values) { DatabaseOperationContext ctx = new DatabaseOperationContext(); ctx.Info = info; ctx.SpName = spName; ctx.Parameters = parameters; ctx.Values = values; ctx.Ex = null; ctx.Watch = Stopwatch.StartNew(); if (parameters != null && values != null && parameters.Length != values.Length) { string msg = string.Format("{0} Parameters({1}) != Values({2})", spName, parameters.Length, values.Length); throw new InvalidOperationException(msg); } ctx.Operation = GetInnerOperation(); TracingManager.Info( delegate() { _tracing.Info(info + ":\r\n" + ctx.Operation.FormatSql(spName, parameters, values)); } ); ctx.Observer = GetObserverItem(spName); _perfCounters.CommandExecutedTotal.Increment(); _perfCounters.CommandExecutedPerSec.Increment(); return(ctx); }
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(); } }
public T EndInvoke <T>() { T retValue; var request = _trans.Request; var response = _trans.Response; if (response.ErrorCode != RpcErrorCode.OK) { throw new RpcException(response.ErrorCode, _trans.ServiceUrl, "RpcResponse Failed", response.Error); } if (typeof(T) == typeof(RpcNull) || _trans.Response.BodyBuffer == null) { retValue = default(T); } else { try { retValue = _trans.Response.BodyBuffer.GetValue <T>(); } catch (Exception ex) { byte[] buffer = _trans.Response.BodyBuffer.GetByteArray(); _observer.RequestTracer.WarnFmt2( ex, request.ServiceAtComputer, request.ContextUri, "ResponseBuffer byte[{0}] = {1}", buffer.Length, StrUtils.ToHexString(buffer, 500) ); throw new RpcException(RpcErrorCode.InvaildResponseArgs, _trans.ServiceUrl, "RpcClientContext.EndInvoke<T>, Failed", ex); } } TracingManager.Info( delegate() { _observer.ResponseTracer.InfoFmt2( request.FromService, request.ContextUri, "Args={0}\r\nResults={1}", ObjectHelper.DumpObject(request.BodyValue), ObjectHelper.DumpObject(response.BodyValue) ); } ); return(retValue); }
public void SendRequest(Action <long, RpcClientContext, bool> callback, int timeout) { RpcRequest request = _trans.Request; Stopwatch watch = new Stopwatch(); _callback = callback; _observer = RpcObserverManager.GetClientItem(_trans.ServerUri.ToString(), request.Service, request.Method, _trans.ServiceRole); watch.Start(); try { _trans.SendRequest( delegate { var response = _trans.Response; long elapseTicks = watch.ElapsedTicks; bool successed = response.ErrorCode == RpcErrorCode.OK; _observer.Track(successed, response.Error, elapseTicks); _callback(elapseTicks, this, successed); }, timeout ); TracingManager.Info( delegate() { _observer.RequestTracer.InfoFmt2( request.ServiceAtComputer, request.ContextUri, "Args = {0}", ObjectHelper.DumpObject(request.BodyValue) ); } ); } catch (Exception ex) { _observer.RequestTracer.ErrorFmt2( ex, request.FromService, request.ContextUri.ToString(), "Args = {0}", ObjectHelper.DumpObject(request.BodyValue) ); var response = RpcResponse.Create(RpcErrorCode.SendFailed, ex); long elapseTicks = watch.ElapsedTicks; _observer.Track(false, response.Error, elapseTicks); _callback(elapseTicks, this, false); } }
public T EndInvoke <T>() { T retValue = default(T); Exception error = null; try { if (_response.ErrorCode != RpcErrorCode.OK) { throw new RpcException("EndInvoke Failed", _serviceUrl, _response.ErrorCode, _response.Error); } if (typeof(T) == typeof(RpcNull) || !_response.HasBody) { retValue = default(T); } else { retValue = _trans.ReceiveResponse <T>(); } TracingManager.Info( delegate() { _observer.ResponseTracer.InfoFmt2( _request.FromService, _request.ToUri, "Args={0}\r\nResults={1}", ObjectHelper.DumpObject(_args), ObjectHelper.DumpObject((object)retValue) ); } ); return(retValue); } catch (Exception ex) { _observer.ResponseTracer.ErrorFmt2( ex, _request.FromService, _request.ToUri, "Args={0}\r\n", ObjectHelper.DumpObject(_args) ); error = ex; throw; } }
/// <summary> /// 获取请求参数 /// </summary> /// <typeparam name="T">请求参数类型</typeparam> /// <returns>请求参数</returns> public T GetArgs <T>() { try { T ret; if (_request.BodyBuffer == null) { object a = null; ret = (T)a; } else { ret = _trans.Request.BodyBuffer.GetValue <T>(); TracingManager.Info( delegate() { _observer.RequestTracer.InfoFmt2( _request.ServiceAtComputer, _request.ContextUri, "Args={0}", ObjectHelper.DumpObject(_trans.Request.BodyValue) ); } ); } return(ret); } catch (Exception ex) { byte[] buffer = _trans.Request.BodyBuffer.GetByteArray(); _observer.RequestTracer.ErrorFmt2( ex, _request.ServiceAtComputer, _request.ContextUri, "RequestBuffer byte[{0}] = {1}", buffer.Length, StrUtils.ToHexString(buffer, 500) ); throw new RpcException(RpcErrorCode.InvaildRequestArgs, _trans.ServiceUrl, "RpcServerContext.GetArgs(), Failed", ex); } }
internal void SendRequest <TArgs>(TArgs args, int timeout) { _observer = RpcObserverManager.GetClientItem(_request.ServerUri, _request.Service, _request.Method, _serviceRole); Stopwatch watch = new Stopwatch(); watch.Start(); try { _args = args; _trans.SendRequest <TArgs>( _request, args, response => ProcessResponse(response, watch.ElapsedTicks), timeout ); TracingManager.Info( delegate() { _observer.RequestTracer.InfoFmt2( _request.FromService, _request.ToUri, "Args = {0}", ObjectHelper.DumpObject(_args) ); } ); } catch (Exception ex) { _observer.RequestTracer.ErrorFmt2( ex, _request.FromService, _request.ToUri.ToString(), "Args = {0}", ObjectHelper.DumpObject(_args) ); throw; } }
public void SendRequest(JsonRpcRequest rpcRequest, int timeout, Action <JsonRpcResponse> callback) { // Console.WriteLine("发送请求11111111111111"+DateTime.Now.ToShortDateString()); TracingManager.Info( delegate() { string module = null; string action = null; if (rpcRequest.Header != null) { module = rpcRequest.Header["UU-REQUEST-MODULE"] == null ? "" : rpcRequest.Header["UU-REQUEST-MODULE"]; action = rpcRequest.Header["UU-REQUEST-ACTION"] == null ? "" : rpcRequest.Header["UU-REQUEST-ACTION"]; } _tracing.Info(string.Format("jsonrpc request:uri={0} module={1} action={2}\r\nrequestbody:{3}", rpcRequest.ServiceUri, module, action, rpcRequest.ReqBody)); } ); _sericeUri = rpcRequest.ServiceUri; _callback = callback; _webRequest = HttpWebRequest.Create(new Uri(_sericeUri)); _webRequest.Method = "POST"; _webRequest.Proxy = null; _webRequest.ContentType = "application/json"; _webRequest.Headers.Add(HttpRequestHeader.From, rpcRequest.FromComputer); _webRequest.Headers.Add(HttpRequestHeader.Pragma, rpcRequest.FromService); if (rpcRequest.Header != null && rpcRequest.Header.Count > 0) { foreach (string key in rpcRequest.Header.AllKeys) { _webRequest.Headers.Add(key, rpcRequest.Header[key]); } } byte[] buffer = null; if (rpcRequest.ReqBody == null) { _webRequest.ContentLength = 0; } else { buffer = Encoding.UTF8.GetBytes(rpcRequest.ReqBody);//Request.BodyBuffer.GetByteArray(); _webRequest.ContentLength = buffer.Length; } timeout = timeout > 0 ? timeout : _timeOut; if (timeout > 0) { _waitHandle = new ManualResetEvent(false); _registeredHandle = ThreadPool.RegisterWaitForSingleObject(_waitHandle, new WaitOrTimerCallback(TimeoutCallback), this, timeout, true); } if (_webRequest.ContentLength == 0) { _webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), this); } else { _webRequest.BeginGetRequestStream( delegate(IAsyncResult asyncResult) { JsonRpcHttpClientTransaction trans = (JsonRpcHttpClientTransaction)asyncResult.AsyncState; try { WebRequest webReq = trans._webRequest; Stream stream = webReq.EndGetRequestStream(asyncResult); stream.Write(buffer, 0, buffer.Length); stream.Close(); webReq.BeginGetResponse(new AsyncCallback(ResponseCallback), this); } catch (Exception ex) { var rpcResonse = new JsonRpcResponse(JsonRpcErrorCode.SendFailed, null, new JsonRpcException(_sericeUri, "send failed", ex), 0); trans.OnCallback(rpcResonse); } }, this ); } }
//public bool Wait() //{ // if (_waitHandle != null) // return _waitHandle.WaitOne(_timeOut + 10000); // return false; //} private static void ResponseCallback(IAsyncResult asyncResult) { //Console.WriteLine("接收应答222222222222222" + DateTime.Now.ToShortDateString()); JsonRpcHttpClientTransaction trans = (JsonRpcHttpClientTransaction)asyncResult.AsyncState; JsonRpcResponse response = null; WebResponse webResponse = null; try { webResponse = trans._webRequest.EndGetResponse(asyncResult); trans._webResponse = webResponse; string warn = webResponse.Headers.Get("UU-RESPONSE-RC"); string lengthStr = webResponse.Headers.Get("UU-CONTENT-LENGTH"); int length = 0; int.TryParse(lengthStr + "", out length); int orginalErrorCode = 0; int.TryParse(warn, out orginalErrorCode); string respBody = null; if (length > 0) { Stream stream = webResponse.GetResponseStream(); StreamReader readerStream = new StreamReader(stream); respBody = readerStream.ReadToEnd(); readerStream.Close(); } if (!string.IsNullOrEmpty(warn) && warn != "0") { JsonRpcErrorCode errCode = JsonRpcErrorCode.Unknown; Enum.TryParse <JsonRpcErrorCode>(warn, true, out errCode); response = new JsonRpcResponse(errCode, respBody, new JsonRpcException(trans._sericeUri, respBody, new Exception("rc != 0")), orginalErrorCode); } else { response = new JsonRpcResponse(JsonRpcErrorCode.OK, respBody); } TracingManager.Info( delegate() { string responseCode = warn == null ? "0" : warn; _tracing.Info(string.Format("jsonrpc response:response rc ={0}\r\nresponse body:{1}", responseCode, respBody)); //if (responseCode != "0") //{ // _tracing.ErrorFmt(response.Exception, "web data response error ,originalerrorcode is {0}", orginalErrorCode); //} } ); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.Timeout) { response = new JsonRpcResponse(JsonRpcErrorCode.TransactionTimeout, new JsonRpcException(null, null, ex), 500); } else { response = new JsonRpcResponse(JsonRpcErrorCode.SendFailed, new JsonRpcException(null, null, ex), 500); } } catch (Exception ex) { SystemLog.Error(LogEventID.RpcFailed, ex, "SendRequest failed"); response = new JsonRpcResponse(JsonRpcErrorCode.SendFailed, new JsonRpcException(null, null, ex), 500); } finally { if (webResponse != null) { webResponse.Close(); } trans.OnCallback(response); } }