public void SendRequest <T>(RpcRequestHeader request, T args, Action <RpcResponseHeader> callback, int timeout) { _args = args; _request = request; _callback = callback; _channel.OnTransactionStart(this); }
void IRpcClientTransaction.SendRequest <T>(RpcRequestHeader request, T args, Action <RpcResponseHeader> callback, int timeout) { _callback = callback; _serviceUrl = string.Format("{0}/{1}.{2}", request.ServerUri, request.Service, request.Method); _webRequest = HttpWebRequest.Create(_serviceUrl); _webRequest.Method = "POST"; _webRequest.Proxy = null; _webRequest.ContentType = "multipart/byteranges"; _webRequest.Headers.Add(HttpRequestHeader.From, request.ServiceAtComputer); _webRequest.Headers.Add(HttpRequestHeader.Pragma, _serviceUrl); _webRequest.Headers.Add(HttpRequestHeader.Cookie, "to=" + ObjectHelper.ToString(request.ToUri)); byte[] buffer = null; if (!request.HasBody) { _webRequest.Headers.Add("Null", "true"); _webRequest.ContentLength = 0; } else { buffer = ProtoBufSerializer.ToByteArray <T>(args); _webRequest.ContentLength = buffer.Length; } timeout = timeout > 0 ? timeout : _channel.Timeout; if (timeout > 0) { _waitHandle = new ManualResetEvent(false); 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) { try { Stream stream = _webRequest.EndGetRequestStream(asyncResult); stream.Write(buffer, 0, buffer.Length); stream.Close(); _webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), this); } catch (Exception ex) { var resp = RpcResponseHeader.CreateError(RpcErrorCode.SendFailed, ex); _callback(resp); } }, this ); } }
public RpcRequestHeader ReceiveRequestHeader() { _context = RpcPipeStreamHelper.ReadStream(_stream, out _buffer); RpcRequestHeader header = new RpcRequestHeader(); header.ServiceAtComputer = _context.From; header.Service = _context.ServiceName; header.Method = _context.MethodName; header.HasBody = _context.HasBody; header.ToUri = _context.To; return(header); }
public RpcRequestHeader ReceiveRequestHeader() { HttpListenerRequest request = _httpContext.Request; string url = _httpContext.Request.Url.ToString(); var header = new RpcRequestHeader(); header.ServiceAtComputer = request.Headers["From"]; int l = url.LastIndexOf("/"); header.ServerUri = url.Substring(0, l); header.ServiceDotMethod = url.Substring(l + 1); header.HasBody = (request.Headers["Null"] != "true"); header.ToUri = ObjectHelper.ToString(request.Headers["ToUri"]); return(header); }
public void SendRequest <T>(RpcRequestHeader request, T args, Action <RpcResponseHeader> callback, int timeout) { _callback = callback; _context = new RpcPipeContext(); _context.From = request.ServiceAtComputer; _context.To = request.ToUri; _context.ServiceName = request.Service; _context.MethodName = request.Method; _context.HasBody = request.HasBody; _stream = new NamedPipeClientStream(_serverUri.Computer, _serverUri.PipeName, PipeDirection.InOut, PipeOptions.Asynchronous); try { timeout = timeout > 0 ? timeout : _channel.Timeout; if (timeout > 0) { _stream.Connect(timeout); } else { _stream.Connect(); } if (request.HasBody) { RpcPipeStreamHelper.WriteStream <T>(_stream, _context, args); } else { RpcPipeStreamHelper.WriteStream <RpcNull>(_stream, _context, null); } RpcResponseHeader header; _context = RpcPipeStreamHelper.ReadStream(_stream, out _bodyBuffer); if (_context.RetCode == RpcErrorCode.OK) { header = RpcResponseHeader.CreateSuccess(_context.HasBody); } else { if (_bodyBuffer != null) { Exception ex = BinarySerializer.FromByteArray <Exception>(_bodyBuffer); header = RpcResponseHeader.CreateError(_context.RetCode, ex); } else { header = RpcResponseHeader.CreateError(_context.RetCode, null); } } _callback(header); } catch (Exception ex) { var header = RpcResponseHeader.CreateError(RpcErrorCode.SendFailed, ex); _callback(header); } finally { if (_stream != null) { _stream.Close(); } } }