Beispiel #1
0
        internal void Listen(string channelName)
        {
            Stopped = false;

            while (!Stopped)
            {
                NullMessages.RequestMessage requestMessage;

                // get next request message from the channel queue
                if (NullMessages.TryGetRequestMessage(channelName, out requestMessage))
                {
                    // queue user work item to process the message
                    ThreadPool.QueueUserWorkItem(ProcessMessage, requestMessage);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Processes the given method call message synchronously.
        /// </summary>
        private void InternalProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage replyMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // add message Uri to the transport headers
            var mcm = (IMethodCallMessage)msg;

            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;
            requestHeaders["__CustomErrorsEnabled"]        = CustomErrorsEnabled.Value;

            // create the request message
            var requestMessage = new NullMessages.RequestMessage
            {
                Message        = msg,
                RequestHeaders = requestHeaders,
                RequestStream  = requestStream
            };

            // process the request and receive the response message
            var responseMessage = NullMessages.ProcessRequest(ChannelName, requestMessage);

            // return processed message parts
            responseHeaders = responseMessage.ResponseHeaders;
            responseStream  = responseMessage.ResponseStream;
            replyMsg        = responseMessage.Message;
        }
Beispiel #3
0
        private void ProcessMessage(object waitCallbackState)
        {
            var requestMessage = (NullMessages.RequestMessage)waitCallbackState;

            // replace full url with object url
            var    url = requestMessage.RequestHeaders[CommonTransportKeys.RequestUri].ToString();
            string objectUri;

            NullChannel.ParseUrl(url, out objectUri);
            objectUri = objectUri ?? url;
            requestMessage.RequestHeaders[CommonTransportKeys.RequestUri] = objectUri;
            requestMessage.Message.Properties["__Uri"] = objectUri;

            // add client address property for compatibility
            var callContext = requestMessage.Message.Properties["__CallContext"] as LogicalCallContext;

            callContext.SetData(ClientAddressSink.CallContextSlotName, IPAddress.Loopback);

            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            // create sink stack to process request message
            var stack = new ServerChannelSinkStack();

            stack.Push(this, null);

            // process request message
            ServerProcessing serverProcessing;

            if (NextChannelSink != null)
            {
                // full processing mode, with deserialization
                serverProcessing = NextChannelSink.ProcessMessage(stack, null,
                                                                  requestMessage.RequestHeaders, requestMessage.RequestStream,
                                                                  out responseMsg, out responseHeaders, out responseStream);
            }
            else
            {
                // fast processing mode, bypassing deserialization
                serverProcessing = ChannelServices.DispatchMessage(stack, requestMessage.Message, out responseMsg);
                responseHeaders  = null;
                responseStream   = null;
            }

            // send back the reply
            switch (serverProcessing)
            {
            case ServerProcessing.Complete:
                stack.Pop(this);
                NullMessages.AddResponse(requestMessage, new NullMessages.ResponseMessage
                {
                    Message         = responseMsg,
                    ResponseHeaders = responseHeaders,
                    ResponseStream  = responseStream
                });
                break;

            case ServerProcessing.Async:
                stack.StoreAndDispatch(NextChannelSink, null);
                break;

            case ServerProcessing.OneWay:
                stack.Pop(this);
                break;
            }
        }