public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) { if (requestStream.Length > int.MaxValue) { throw new NotImplementedException("TcpEx Channel can only accept messages up to int.MaxValue in size."); // TODO: FixMe } Connection connection = PrepareRequest(msg, ref requestHeaders); Guid msgGuid = Guid.NewGuid(); IAsyncResult ar = Manager.BeginReadMessage(msgGuid, connection, null, null); Message.Send(connection, msgGuid, requestHeaders, requestStream); ar.AsyncWaitHandle.WaitOne(); Connection replyConnection; Message reply = Manager.EndReadMessage(out replyConnection, ar); Debug.Assert(connection == replyConnection); responseHeaders = reply.Headers; responseStream = reply.MessageBody; }
public void ReceiveMessage(IAsyncResult ar) { // Request next message... Manager.BeginReadMessage(ar.AsyncState, null, new AsyncCallback(ReceiveMessage), ar.AsyncState); Connection connection; Message request = Manager.EndReadMessage(out connection, ar); request.Headers["__CustomErrorsEnabled"] = RemotingConfiguration.CustomErrorsEnabled(connection.IsLocalHost); IMessage responseMsg; ITransportHeaders responseHeaders; Stream responseStream; var serverProcessing = ProcessMessage(new ServerChannelSinkStack(), null, request.Headers, request.MessageBody, out responseMsg, out responseHeaders, out responseStream); if (serverProcessing != ServerProcessing.OneWay) { Message.Send(connection, request.Guid, responseHeaders, responseStream); responseStream.Close(); } }