Exemple #1
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // add message Uri to headers
            var mcm = (IMethodCallMessage)msg;
            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;

            // send data (FIXME: 1) add reliability, 2) handle exceptions)
            var transport = new UdpTransport(UdpClient);
            transport.Write(requestHeaders, requestStream, ServerEndpoint);

            // if the call is not one-way, schedule an async call
            if (!RemotingServices.IsOneWay(mcm.MethodBase))
            {
                ThreadPool.QueueUserWorkItem((s) =>
                {
                    try
                    {
                        ITransportHeaders responseHeaders;
                        Stream responseStream;
                        IPEndPoint remote;
                        transport.Read(out responseHeaders, out responseStream, out remote);
                        sinkStack.AsyncProcessResponse(responseHeaders, responseStream);
                    }
                    catch (Exception ex)
                    {
                        sinkStack.DispatchException(ex);
                    }
                });
            }
        }
        /// <summary>
        /// Processes an asynchronous request.
        /// </summary>
        /// <param name="sinkStack">Channel sink stack</param>
        /// <param name="msg">Message to processed</param>
        /// <param name="headers">Transport headers</param>
        /// <param name="stream">Request stream</param>
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
        {
            stream = CreateEnvelope(stream, headers);

            sinkStack.Push(this, null);
            _nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
        }
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, 
     ITransportHeaders headers, Stream stream)
 {
     // перенаправляем вызов следующему приемнику в стеке
     sinkStack.Push(this, null);
     _nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
Exemple #4
0
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
     ITransportHeaders headers, Stream stream)
 {
     // never gets called, this sink is always first
     sinkStack.Push(this, null);
     _nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
		public void AsyncProcessRequest(
			IClientChannelSinkStack sinkStack_in,
			IMessage msg_in,
			ITransportHeaders headers_in,
			Stream stream_in
		) {
			#region encrypt...
			headers_in[EncryptionHelper.X_ENCRYPT] = "1";
			headers_in[EncryptionHelper.X_CLIENTID] = this.clientid_;
			stream_in
				= EncryptionHelper.Encrypt(
					stream_in,
					false,
					this.keyspath_,
					this.clientid_
				); 
			#endregion

			sinkStack_in.Push(this, null);
			this.nextchannelsink_.AsyncProcessRequest(
				sinkStack_in,
				msg_in,
				headers_in,
				stream_in
			);
		} 
		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);
				connection.Stream.Flush ();

				if (!isOneWay) 
				{
					sinkStack.Push (this, connection);
					ThreadPool.QueueUserWorkItem (new WaitCallback(ReadAsyncTcpMessage), sinkStack);
				}
				else
					connection.Release();
			}
			catch
			{
				if (connection != null) connection.Release();
				if (!isOneWay) throw;
			}
		}
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream requestStream)
 {
     ITransportHeaders headers2;
     Stream stream;
     AsyncCallback callback = new AsyncCallback(this.AsyncFinishedCallback);
     new AsyncMessageDelegate(this.AsyncProcessMessage).BeginInvoke(msg, headers, requestStream, out headers2, out stream, sinkStack, callback, null);
 }
 public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
                                  IMessage msg,
                                  ITransportHeaders headers,
                                  Stream stream)
 {
   // should never be called; we're a message transport
   throw new NotSupportedException();
 }
 public void AsyncProcessRequest(
   IClientChannelSinkStack sinkStack,
   IMessage msg,
   ITransportHeaders headers,
   Stream stream)
 {
   throw new Exception("not implemented");
 }
 public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
                                  IMessage msg,
                                  ITransportHeaders headers,
                                  Stream stream)
 {
   AsyncSendMessageStreamDelegate asmd = new AsyncSendMessageStreamDelegate (AsyncSendMessageStream);
   asmd.BeginInvoke (sinkStack, msg, headers, stream, null, null);
 }
		public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
						 IMessage msg,
						 ITransportHeaders headers,
						 Stream stream)
	        {
			// never called because the formatter sink is
			// always the first in the chain
			throw new NotSupportedException("BinaryClientFormatterSink must be the first sink in the IClientChannelSink chain");
		}
Exemple #12
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
        {
            if (stream.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 headers);

            Guid msgGuid = Guid.NewGuid();
            Manager.BeginReadMessage(msgGuid, connection, new AsyncCallback(ProcessResponse), sinkStack);
            Message.Send(connection, msgGuid, headers, stream);
        }
 public void AsyncProcessRequest(
     IClientChannelSinkStack sinkStack,
     IMessage msg,
     ITransportHeaders headers,
     Stream stream)
 {
     // Push this onto the sink stack.
     sinkStack.Push(this, null);
     // Send the request to the client.
     _next.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
        void IClientChannelSink.AsyncProcessRequest(IClientChannelSinkStack sinkStack,
            IMessage msg, ITransportHeaders headers, Stream stream)
        {
            // process request
            object state = null;
            ProcessRequest(msg, headers, ref stream, ref state);

            // push to stack (to get a call to handle response)
            // and forward to the next
            sinkStack.Push(this, state);
            this.nextClientChannelSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
        }
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
 {
     TcpClientSocketHandler handler = this.SendRequestWithRetry(msg, headers, stream);
     if (handler.OneWayRequest)
     {
         handler.ReturnToCache();
     }
     else
     {
         handler.DataArrivedCallback = new WaitCallback(this.ReceiveCallback);
         handler.DataArrivedCallbackState = sinkStack;
         handler.BeginReadMessage();
     }
 }
		public void AsyncProcessRequest (IClientChannelSinkStack sinkStack, IMessage msg,
			ITransportHeaders headers, Stream requestStream)
		{
			bool isOneWay = RemotingServices.IsOneWay (((IMethodMessage)msg).MethodBase);
			
			HttpWebRequest request = CreateRequest (headers);
	
			using (Stream targetStream = request.GetRequestStream ()) {
				CopyStream (requestStream, targetStream, 1024);
			}

			if (!isOneWay) {
				sinkStack.Push (this, request);
				request.BeginGetResponse (new AsyncCallback (AsyncProcessResponseCallback), sinkStack);
			}
		}
        /// <summary>
        /// Verarbeitet eine Anfragenachricht asynchron.
        /// </summary>
        /// <param name="sinkStack">Senkenstapel</param>
        /// <param name="msg">Remoting-Nachricht</param>
        /// <param name="headers">Anfrage-Header-Auflistung</param>
        /// <param name="stream">Anfrage-Datenstrom</param>
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
        {
            // Asynchroner Verarbeitungsstatus
            AsyncProcessingState state = null;

            lock (_lockObject)
            {

                // Asynchronen Verarbeitungsstatus erzeugen
                state = new AsyncProcessingState(msg, headers, ref stream, new Guid());

                //Methode aufrufen die Verarbeitung übernimmt
                DoProcessMessageBefore(msg, headers, stream);

            }
            // Aktuelle Senke auf den Senkenstapel legen (Damit ggf. die Verarbeitung der Antwort später asynchron aufgerufen werden kann)
            sinkStack.Push(this, state);

            // Nächste Kanalsenke aufrufen
            _next.AsyncProcessRequest(sinkStack, msg, headers, stream);
        }
		public void AsyncProcessRequest(
			IClientChannelSinkStack sinkStack_in,
			IMessage msg_in,
			ITransportHeaders headers_in,
			Stream stream_in
		) {
			#region compress...
			headers_in[CompressionHelper.X_COMPRESS] = "1";
			stream_in
				= CompressionHelper.GetCompressedStreamCopy(
					stream_in
				); 
			#endregion

			sinkStack_in.Push(this, null);
			this.nextchannelsink_.AsyncProcessRequest(
				sinkStack_in,
				msg_in,
				headers_in,
				stream_in
			);
		} 
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
        {
            Stream compStream;

            Stream origStream = stream;
            long origPos = stream.Position;

            if ((checkedCompress && serverCanCompress) || (!checkedCompress && assumeCompress)) {
                headers[CompressionHelper.CompressKey] = CompressionHelper.CompressedFlag;
                compStream = CompressionHelper.CompressStream(stream);
                sinkStack.Push(this, new RequestState(origStream, origPos, true, msg, headers));
            }
            else {
                headers[CompressionHelper.CompressKey] = CompressionHelper.CompressRequest;
                compStream = stream;
                sinkStack.Push(this, null);
            }

            try {
                _next.AsyncProcessRequest(sinkStack, msg, headers, compStream);
            }
            catch (Exception) {
            }
        }
 void IClientChannelSink.AsyncProcessRequest(IClientChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage msg, ITransportHeaders headers, System.IO.Stream stream)
 {
     nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
Exemple #21
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msgReq, ITransportHeaders headers, Stream stream)
        {
            // scope state
            string strQueuePath = null;
            string strObjectUri = null;
            Message outMsg = null;
            MessageQueueTransaction mqtx = new MessageQueueTransaction();

            try
            {
                #region pre-processor (mapping url address)
                // split into the queuepath and endpoint
                strObjectUri = ParseLogicalUrl(m_LogicalUri, out strQueuePath);

                // update Uri property
                msgReq.Properties[MSMQChannelProperties.ObjectUri] = strObjectUri;

                // pass TransportHeaders to the receiver
                if(m_Sender.AllowHeaders == true)
                {
                    headers["__RequestUri"] = strObjectUri;
                    msgReq.Properties["__RequestHeaders"] = headers;
                }
                #endregion

                #region send a remoting message
                // set the destination queue
                m_OutQueue.Path = strQueuePath;

                // create a message
                outMsg = new Message(msgReq, new BinaryMessageFormatter());

                // option: timeout to pick-up a message (receive message)
                int intTimeToBeReceived = m_Sender.TimeToBeReceived;
                if(intTimeToBeReceived > 0)
                    outMsg.TimeToBeReceived = TimeSpan.FromSeconds(intTimeToBeReceived);

                // option: timeout to reach destination queue (send message)
                int intTimeToReachQueue = m_Sender.TimeToReachQueue;
                if(intTimeToReachQueue > 0)
                    outMsg.TimeToReachQueue = TimeSpan.FromSeconds(intTimeToReachQueue);

                // option: notify a negative receive on the client/server side
                if(m_Sender.AdminQueuePath != MSMQChannelDefaults.EmptyStr)
                {
                    // acknowledge type (mandatory)
                    outMsg.AcknowledgeType = AcknowledgeTypes.NegativeReceive | AcknowledgeTypes.NotAcknowledgeReachQueue;

                    // admin queue for a time-expired messages
                    outMsg.AdministrationQueue = m_Sender.AdminQueue;
                }

                // message label
                string label = string.Format("{0}/{1}, url={2}", Convert.ToString(msgReq.Properties["__TypeName"]).Split(',')[0],
                    Convert.ToString(msgReq.Properties["__MethodName"]), strObjectUri);

                //// Send message based on the transaction context
                //if(ContextUtil.IsInTransaction == true)
                //{
                //    // we are already in the transaction - automatic (DTC) transactional message
                //    m_OutQueue.Send(outMsg, label, MessageQueueTransactionType.Automatic);
                //}
                //else
                //{
                    // this is a single transactional message
                    mqtx.Begin();
                    m_OutQueue.Send(outMsg, label, mqtx);
                    mqtx.Commit();
                //}
                #endregion
            }
            catch(Exception ex)
            {
                string strError = string.Format("[{0}]MSMQClientTransportSink.AsyncProcessRequest error = {1}, queuepath={2},",
                    m_Sender.ChannelName, ex.Message, strQueuePath);

                m_Sender.WriteLogMsg(strError, EventLogEntryType.Error);
                throw new Exception(strError);
            }
            finally
            {
                #region clean-up
                if(mqtx.Status == MessageQueueTransactionStatus.Pending)
                {
                    mqtx.Abort();
                    Trace.WriteLine(string.Format("[{0}]MSMQClientTransportSink.AsyncProcessRequest Aborted, msgId = {1}", m_Sender.ChannelName, outMsg.Id));
                }

                if(outMsg != null)
                    outMsg.Dispose();
                #endregion
            }
        }
        } // ProcessMessage


        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream stream)
        {
            InternalRemotingServices.RemotingTrace("TcpClientTransportSink::AsyncProcessRequest");

            TcpClientSocketHandler clientSocket =
                SendRequestWithRetry(msg, headers, stream);

            if (clientSocket.OneWayRequest)
            {
                clientSocket.ReturnToCache();
            }
            else
            {
                // do an async read on the reply
                clientSocket.DataArrivedCallback = new WaitCallback(this.ReceiveCallback);
                clientSocket.DataArrivedCallbackState = sinkStack;
                clientSocket.BeginReadMessage();
            }
        } // AsyncProcessRequest
Exemple #23
0
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                 ITransportHeaders headers, Stream stream)
 {
     throw new NotImplementedException();
 }
Exemple #24
0
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                 ITransportHeaders headers, Stream requestStream)
 {
     InternalRemotingServices.RemotingTrace("IpcClientTransportSink::AsyncProcessRequest");
     ITransportHeaders responseHeaders;
     Stream responseStream;
     // Invoke ProcessMessage asynchronously. This should be improved
     // by using Datagram message 
     AsyncCallback callback = new AsyncCallback(this.AsyncFinishedCallback);
     AsyncMessageDelegate async = new AsyncMessageDelegate(this.AsyncProcessMessage);
     async.BeginInvoke(msg, headers, requestStream , out responseHeaders, 
                                                  out responseStream, sinkStack, callback, null);
 } // AsyncProcessRequest
            internal AsyncHttpClientRequestState(
                HttpClientTransportSink transportSink,
                IClientChannelSinkStack sinkStack,
                IMessage msg, 
                ITransportHeaders headers, 
                Stream stream,
                int retryCount)
            {
                _transportSink = transportSink;
                SinkStack = sinkStack;
                _msg = msg;
                _requestHeaders = headers;
                RequestStream = stream;
                _retryCount = retryCount;

                if (RequestStream.CanSeek)
                    _initialStreamPosition = RequestStream.Position;
            } // AsyncHttpClientRequestState
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
 {
     this.nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
        /// <summary>
        /// Requests asynchronous processing of a method call on the current sink.
        /// </summary>
        /// <param name="sinkStack">A stack of channel sinks that called this sink.</param>
        /// <param name="msg">The message to process.</param>
        /// <param name="headers">The headers to add to the outgoing message heading to the server.</param>
        /// <param name="stream">The stream headed to the transport sink.</param>
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream stream)
        {
            ITransportContext iTransportContext = this.ITransportContext;

            if (!GenuineUtility.CheckUrlOnConnectivity(this._recipientUri))
            {
                // get the transport context from the Uri Storage
                iTransportContext = UriStorage.GetTransportContext(this._recipientUri);
                if (iTransportContext == null)
                {
                    iTransportContext = this.ITransportContext;
                }
            }

            Message message = Message.CreateOutcomingMessage(iTransportContext, msg, headers, stream, false);

            message.Recipient = iTransportContext.KnownHosts[this._recipientUri];
            IMethodMessage iMethodMessage = (IMethodMessage)msg;

            message.IsOneWay = RemotingServices.IsOneWay(iMethodMessage.MethodBase);

            // LOG: put down the log record
            BinaryLogWriter binaryLogWriter = this.ITransportContext.BinaryLogWriter;

            if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
            {
                binaryLogWriter.WriteMessageCreatedEvent("GenuineTcpClientTransportSink.AsyncProcessRequest",
                                                         LogMessageType.MessageCreated, null, message, true, message.Recipient,
                                                         this.ITransportContext.BinaryLogWriter[LogCategory.MessageProcessing] > 1 ? message.Stream : null,
                                                         msg.Properties["__Uri"] as string, BinaryLogWriter.ParseInvocationMethod(msg.Properties["__MethodName"] as string, msg.Properties["__TypeName"] as string),
                                                         GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name, null, -1, -1, null, -1, null,
                                                         "Asynchronous .NET Remoting invocaiton is being initiated.");

                message.ITransportHeaders[Message.TransportHeadersInvocationTarget] = msg.Properties["__Uri"] as string;
                message.ITransportHeaders[Message.TransportHeadersMethodName]       = BinaryLogWriter.ParseInvocationMethod(msg.Properties["__MethodName"] as string, msg.Properties["__TypeName"] as string);

                binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineTcpClientTransportSink.AsyncProcessRequest",
                                           LogMessageType.MessageRequestInvoking, null, message, message.Recipient,
                                           null,
                                           GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                           null, null, -1,
                                           GenuineUtility.TickCount, 0, 0, null, null, null, null,
                                           "The .NET Remoting asynchronous invocation is being initiated.");
            }

            // register the response handler
            AsyncSinkStackResponseProcessor asyncSinkStackResponseProcessor = null;

            if (!message.IsOneWay)
            {
                asyncSinkStackResponseProcessor = new AsyncSinkStackResponseProcessor(iTransportContext, message, sinkStack);
                iTransportContext.IIncomingStreamHandler.RegisterResponseProcessor(message.MessageId, asyncSinkStackResponseProcessor);
            }

            try
            {
                // and try to send the message
                iTransportContext.ConnectionManager.Send(message);
            }
            catch (Exception ex)
            {
                asyncSinkStackResponseProcessor.DispatchException(ex);
                throw;
            }
        }
Exemple #28
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream)
        {
            headers[CommonTransportKeys.RequestUri] = ((IMethodCallMessage)msg).Uri;

            // connect
            NamedPipeClient client = new NamedPipeClient(pipeName);
            NamedPipeSocket socket = client.Connect();
            IpcTransport t = new IpcTransport(socket);
            t.Write(headers, stream);

            // schedule an async call
            if (!RemotingServices.IsOneWay(((IMethodCallMessage)msg).MethodBase)) 
            {
                new AsyncResponse(AsyncHandler).BeginInvoke(sinkStack, t, null, null);
            }
        }
 void IClientChannelSink.AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, System.IO.Stream stream)
 {
     nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
 }
        } // ProcessMessage

        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream stream)
        {
            // Send the webrequest, headers, request stream, and retry count.
            AsyncHttpClientRequestState asyncRequestState =
                new AsyncHttpClientRequestState(this, sinkStack, msg, headers, stream, 1);
                       
            asyncRequestState.StartRequest();
        } // AsyncProcessRequest                      
 public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                 ITransportHeaders headers, Stream stream1)
 {
     sinkStack.Push(this, null);
     nextSink1.AsyncProcessRequest(sinkStack, msg, headers, stream1);
 }
Exemple #32
0
        } // ProcessMessage

        private IClientChannelSinkStack AsyncProcessMessage(IMessage msg,
                                   ITransportHeaders requestHeaders, Stream requestStream,
                                   out ITransportHeaders responseHeaders, out Stream responseStream, 
                                   IClientChannelSinkStack sinkStack)
        {
            ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream);
            return sinkStack;
        }
 /// <summary>
 /// Initializes an instance of the AsyncSinkStackResponseProcessor class.
 /// </summary>
 /// <param name="iTransportContext">The Transport Context.</param>
 /// <param name="message">Source message.</param>
 /// <param name="iClientChannelSinkStack">The client channel sink stack.</param>
 public AsyncSinkStackResponseProcessor(ITransportContext iTransportContext, Message message, IClientChannelSinkStack iClientChannelSinkStack)
 {
     this._iTransportContext = iTransportContext;
     this._message = message;
     this._iClientChannelSinkStack = iClientChannelSinkStack;
 }
		public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream)
		{
			// UNDONE:
			throw new NotImplementedException();
		}
Exemple #35
0
 public void AsyncProcessRequest(IClientChannelSinkStack myClientChannelSinkStack, IMessage msg,
                                 ITransportHeaders headers, Stream stream)
 {
 }
Exemple #36
0
 internal AsyncResponseHandler(IClientChannelSinkStack sinkStack)
 {
     _sinkStack = sinkStack;
 }
        } // ProcessMessage

        /// <include file='doc\BinaryFormatterSinks.uex' path='docs/doc[@for="BinaryClientFormatterSink.AsyncProcessRequest"]/*' />
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream stream)
        {
            // should never be called, this sink is always first
            throw new NotSupportedException();
        } // AsyncProcessRequest
Exemple #38
0
 void AsyncHandler(IClientChannelSinkStack sinkStack, IpcTransport transport) 
 {
     try 
     {
         // get the response headers and the response stream from the server
         ITransportHeaders responseHeaders;
         Stream responseStream;
         transport.Read(out responseHeaders, out responseStream);
         transport.Close();
         sinkStack.AsyncProcessResponse(responseHeaders, responseStream);
     }
     catch (Exception ex) 
     {
         sinkStack.DispatchException(ex);
     }
 }
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msgReq, ITransportHeaders headers, Stream stream)
        {
            // scope state
            string  strQueuePath         = null;
            string  strObjectUri         = null;
            Message outMsg               = null;
            MessageQueueTransaction mqtx = new MessageQueueTransaction();

            try
            {
                #region pre-processor (mapping url address)
                // split into the queuepath and endpoint
                strObjectUri = ParseLogicalUrl(m_LogicalUri, out strQueuePath);

                // update Uri property
                msgReq.Properties[MSMQChannelProperties.ObjectUri] = strObjectUri;

                // pass TransportHeaders to the receiver
                if (m_Sender.AllowHeaders == true)
                {
                    headers["__RequestUri"] = strObjectUri;
                    msgReq.Properties["__RequestHeaders"] = headers;
                }
                #endregion

                #region send a remoting message
                // set the destination queue
                m_OutQueue.Path = strQueuePath;

                // create a message
                outMsg = new Message(msgReq, new BinaryMessageFormatter());

                // option: timeout to pick-up a message (receive message)
                int intTimeToBeReceived = m_Sender.TimeToBeReceived;
                if (intTimeToBeReceived > 0)
                {
                    outMsg.TimeToBeReceived = TimeSpan.FromSeconds(intTimeToBeReceived);
                }

                // option: timeout to reach destination queue (send message)
                int intTimeToReachQueue = m_Sender.TimeToReachQueue;
                if (intTimeToReachQueue > 0)
                {
                    outMsg.TimeToReachQueue = TimeSpan.FromSeconds(intTimeToReachQueue);
                }

                // option: notify a negative receive on the client/server side
                if (m_Sender.AdminQueuePath != MSMQChannelDefaults.EmptyStr)
                {
                    // acknowledge type (mandatory)
                    outMsg.AcknowledgeType = AcknowledgeTypes.NegativeReceive | AcknowledgeTypes.NotAcknowledgeReachQueue;

                    // admin queue for a time-expired messages
                    outMsg.AdministrationQueue = m_Sender.AdminQueue;
                }

                // message label
                string label = string.Format("{0}/{1}, url={2}", Convert.ToString(msgReq.Properties["__TypeName"]).Split(',')[0],
                                             Convert.ToString(msgReq.Properties["__MethodName"]), strObjectUri);

                //// Send message based on the transaction context
                //if(ContextUtil.IsInTransaction == true)
                //{
                //    // we are already in the transaction - automatic (DTC) transactional message
                //    m_OutQueue.Send(outMsg, label, MessageQueueTransactionType.Automatic);
                //}
                //else
                //{
                // this is a single transactional message
                mqtx.Begin();
                m_OutQueue.Send(outMsg, label, mqtx);
                mqtx.Commit();
                //}
                #endregion
            }
            catch (Exception ex)
            {
                string strError = string.Format("[{0}]MSMQClientTransportSink.AsyncProcessRequest error = {1}, queuepath={2},",
                                                m_Sender.ChannelName, ex.Message, strQueuePath);

                m_Sender.WriteLogMsg(strError, EventLogEntryType.Error);
                throw new Exception(strError);
            }
            finally
            {
                #region clean-up
                if (mqtx.Status == MessageQueueTransactionStatus.Pending)
                {
                    mqtx.Abort();
                    Trace.WriteLine(string.Format("[{0}]MSMQClientTransportSink.AsyncProcessRequest Aborted, msgId = {1}", m_Sender.ChannelName, outMsg.Id));
                }

                if (outMsg != null)
                {
                    outMsg.Dispose();
                }
                #endregion
            }
        }