示例#1
0
        public void ProcessMessage(IMessage msg,
                                   ITransportHeaders requestHeaders,
                                   Stream requestStream,
                                   out ITransportHeaders responseHeaders,
                                   out Stream responseStream)
        {
            IMethodCallMessage mcall = msg as IMethodCallMessage;

            if (_rd == null)
            {
                _rd = _e.ReceiverDispatcher;
            }

            int requestId = (int)mcall.LogicalCallContext.GetData("__iceRequestId");

            // Register the reply notification /before/ we even send the
            // request
            ManualResetEvent mre = null;

            if (requestId != 0)
            {
                mre = _rd.RegisterReplyNotification(requestId);
            }

            lock (_e.Stream) {
                ((MemoryStream)requestStream).WriteTo(_e.Stream);
            }

            // oneway invocation, nothing to respond
            if (requestId == 0)
            {
                responseHeaders = null;
                responseStream  = null;
                return;
            }

            // wait for the reply to come in
            Trace.WriteLine("ClientTransportSink Waiting on requestID " + requestId);
            mre.WaitOne();
            Trace.WriteLine("ClientTransportSink got notification, requestID " + requestId);
            MemoryStream ms = _rd.GetMessageStream(requestId);

            responseStream  = ms;
            responseHeaders = new TransportHeaders();
        }
示例#2
0
        private void AsyncSendMessageStream(IClientChannelSinkStack sinkStack,
                                            IMessage msg,
                                            ITransportHeaders requestHeaders,
                                            Stream requestStream)
        {
            IMethodCallMessage mcall = msg as IMethodCallMessage;

            if (_rd == null)
            {
                _rd = _e.ReceiverDispatcher;
            }

            int requestId        = (int)mcall.LogicalCallContext.GetData("__iceRequestId");
            ManualResetEvent mre = null;

            if (requestId != 0)
            {
                mre = _rd.RegisterReplyNotification(requestId);
            }

            lock (_e.Stream) {
                ((MemoryStream)requestStream).WriteTo(_e.Stream);
            }

            // oneway invocation, no response
            if (requestId == 0)
            {
                return;
            }

            mre.WaitOne();
            MemoryStream     responseStream  = _rd.GetMessageStream(requestId);
            TransportHeaders responseHeaders = new TransportHeaders();

            sinkStack.AsyncProcessResponse(responseHeaders, responseStream);
        }
示例#3
0
    public void ProcessMessage (IMessage msg,
                                ITransportHeaders requestHeaders,
                                Stream requestStream,
                                out ITransportHeaders responseHeaders,
                                out Stream responseStream)
    {
      IMethodCallMessage mcall = msg as IMethodCallMessage;

      if (_rd == null) {
        _rd = _e.ReceiverDispatcher;
      }

      int requestId = (int) mcall.LogicalCallContext.GetData("__iceRequestId");

      // Register the reply notification /before/ we even send the
      // request
      ManualResetEvent mre = null;

      if (requestId != 0)
         mre = _rd.RegisterReplyNotification (requestId);

      lock (_e.Stream) {
        ((MemoryStream) requestStream).WriteTo (_e.Stream);
      }

      // oneway invocation, nothing to respond
      if (requestId == 0) {
        responseHeaders = null;
        responseStream = null;
        return;
      }

      // wait for the reply to come in
      Trace.WriteLine ("ClientTransportSink Waiting on requestID " + requestId);
      mre.WaitOne();
      Trace.WriteLine ("ClientTransportSink got notification, requestID " + requestId);
      MemoryStream ms = _rd.GetMessageStream (requestId);

      responseStream = ms;
      responseHeaders = new TransportHeaders();
    }
示例#4
0
    private void AsyncSendMessageStream (IClientChannelSinkStack sinkStack,
                                         IMessage msg,
                                         ITransportHeaders requestHeaders,
                                         Stream requestStream)
    {
      IMethodCallMessage mcall = msg as IMethodCallMessage;

      if (_rd == null) {
        _rd = _e.ReceiverDispatcher;
      }

      int requestId = (int) mcall.LogicalCallContext.GetData("__iceRequestId");
      ManualResetEvent mre = null;

      if (requestId != 0)
        mre = _rd.RegisterReplyNotification (requestId);

      lock (_e.Stream) {
        ((MemoryStream) requestStream).WriteTo (_e.Stream);
      }

      // oneway invocation, no response
      if (requestId == 0) {
        return;
      }

      mre.WaitOne();
      MemoryStream responseStream = _rd.GetMessageStream (requestId);
      TransportHeaders responseHeaders = new TransportHeaders();

      sinkStack.AsyncProcessResponse (responseHeaders, responseStream);
    }