public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers, Stream responseStream) { ClientConnection connection = (ClientConnection)state; NetworkStream ns = new NetworkStream(connection.Socket); TcpMessageIO.SendMessageStream(ns, responseStream, headers, connection.Buffer); ns.Flush(); ns.Close(); }
public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream requestStream) { TcpConnection connection = null; bool isOneWay = RemotingServices.IsOneWay(((IMethodMessage)msg).MethodBase); try { if (headers == null) { headers = new TransportHeaders(); } headers [CommonTransportKeys.RequestUri] = ((IMethodMessage)msg).Uri; // Sends the stream using a connection from the pool // and creates a WorkItem that will wait for the // response of the server connection = TcpConnectionPool.GetConnection(_host, _port); TcpMessageIO.SendMessageStream(connection.Stream, requestStream, headers, connection.Buffer, isOneWay); connection.Stream.Flush(); if (!isOneWay) { sinkStack.Push(this, connection); ThreadPool.QueueUserWorkItem(new WaitCallback(data => { try { ReadAsyncTcpMessage(data); } catch {} }), sinkStack); } else { connection.Release(); } } catch { if (connection != null) { connection.Release(); } if (!isOneWay) { throw; } } }
internal void InternalProcessMessage(ClientConnection connection, Stream stream) { // Reads the headers and the request stream Stream requestStream; ITransportHeaders requestHeaders; requestStream = TcpMessageIO.ReceiveMessageStream(stream, out requestHeaders, connection.Buffer); requestHeaders [CommonTransportKeys.IPAddress] = connection.ClientAddress; requestHeaders [CommonTransportKeys.ConnectionId] = connection.Id; string uri = (string)requestHeaders [CommonTransportKeys.RequestUri]; TcpChannel.ParseChannelUrl(uri, out uri); if (uri != null) { requestHeaders [CommonTransportKeys.RequestUri] = uri; } // Pushes the connection object together with the sink. This information // will be used for sending the response in an async call. ServerChannelSinkStack sinkStack = new ServerChannelSinkStack(); sinkStack.Push(this, connection); ITransportHeaders responseHeaders; Stream responseStream; IMessage responseMsg; ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); switch (proc) { case ServerProcessing.Complete: TcpMessageIO.SendMessageStream(stream, responseStream, responseHeaders, connection.Buffer); stream.Flush(); break; case ServerProcessing.Async: case ServerProcessing.OneWay: break; } }
public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) { TcpConnection connection = null; try { if (requestHeaders == null) { requestHeaders = new TransportHeaders(); } requestHeaders [CommonTransportKeys.RequestUri] = ((IMethodMessage)msg).Uri; // Sends the message connection = TcpConnectionPool.GetConnection(_host, _port); TcpMessageIO.SendMessageStream(connection.Stream, requestStream, requestHeaders, connection.Buffer); connection.Stream.Flush(); // Reads the response MessageStatus status = TcpMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer); if (status != MessageStatus.MethodMessage) { throw new RemotingException("Unknown response message from server"); } responseStream = TcpMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer); } finally { if (connection != null) { connection.Release(); } } }