Ejemplo n.º 1
0
        public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            UnixConnection connection = null;

            try
            {
                if (requestHeaders == null)
                {
                    requestHeaders = new TransportHeaders();
                }
                requestHeaders["__RequestUri"] = ((IMethodMessage)msg).Uri;
                connection = UnixConnectionPool.GetConnection(this._path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, requestHeaders, connection.Buffer);
                connection.Stream.Flush();
                if (UnixMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer) != MessageStatus.MethodMessage)
                {
                    throw new RemotingException("Unknown response message from server");
                }
                responseStream = UnixMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer);
            }
            finally
            {
                if (connection != null)
                {
                    connection.Release();
                }
            }
        }
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
                                        ITransportHeaders headers, Stream requestStream)
        {
            UnixConnection connection = null;
            bool           isOneWay   = RemotingServices.IsOneWay(((IMethodMessage)msg).MethodBase);

            try
            {
                if (headers == null)
                {
                    headers = new TransportHeaders();
                }
                headers ["__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 = UnixConnectionPool.GetConnection(_path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, headers, connection.Buffer);
                connection.Stream.Flush();

                if (!isOneWay)
                {
                    sinkStack.Push(this, connection);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(data =>
                    {
                        try {
                            ReadAsyncUnixMessage(data);
                        }
                        catch {}
                    }), sinkStack);
                }
                else
                {
                    connection.Release();
                }
            }
            catch
            {
                if (connection != null)
                {
                    connection.Release();
                }
                if (!isOneWay)
                {
                    throw;
                }
            }
        }
Ejemplo n.º 3
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream requestStream)
        {
            UnixConnection connection = null;
            bool           flag       = RemotingServices.IsOneWay(((IMethodMessage)msg).MethodBase);

            try
            {
                if (headers == null)
                {
                    headers = new TransportHeaders();
                }
                headers["__RequestUri"] = ((IMethodMessage)msg).Uri;
                connection = UnixConnectionPool.GetConnection(this._path);
                UnixMessageIO.SendMessageStream(connection.Stream, requestStream, headers, connection.Buffer);
                connection.Stream.Flush();
                if (flag)
                {
                    connection.Release();
                }
                else
                {
                    sinkStack.Push(this, connection);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReadAsyncUnixMessage), sinkStack);
                }
            }
            catch
            {
                if (connection != null)
                {
                    connection.Release();
                }
                if (!flag)
                {
                    throw;
                }
            }
        }