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); } } }
/// <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; }
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; } }