2 using System.Collections.Generic;
3 using System.ServiceModel;
4 using System.ServiceModel.Channels;
5 using System.ServiceModel.Security;
6 using System.ServiceModel.Security.Tokens;
9 namespace System.ServiceModel.Dispatcher
11 internal class BaseRequestProcessor
13 HandlersChain initialize_handlers_chain = new HandlersChain();
14 HandlersChain process_handlers_chain = new HandlersChain ();
15 HandlersChain error_handlers_chain = new HandlersChain ();
16 HandlersChain finalize_handlers_chain = new HandlersChain ();
18 protected BaseRequestProcessor () { }
20 protected virtual void ProcessRequest (MessageProcessingContext mrc)
22 initialize_handlers_chain.ProcessRequestChain (mrc);
24 using (new OperationContextScope (mrc.OperationContext)) {
26 process_handlers_chain.ProcessRequestChain (mrc);
29 // FIXME: this is not really expected use of ChannelDispatcher.ErrorHandlers.
30 // They are now correctly used in process_handler_chain (namely OperationInvokerHandler).
31 // For this kind of "outsider" exceptions are actually left thrown
32 // (and could even cause server loop crash in .NET).
34 Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);
35 mrc.ProcessingException = e;
36 error_handlers_chain.ProcessRequestChain (mrc);
39 finalize_handlers_chain.ProcessRequestChain (mrc);
44 public HandlersChain InitializeChain
46 get { return initialize_handlers_chain; }
49 public HandlersChain ProcessingChain
51 get { return process_handlers_chain; }
54 public HandlersChain ErrorChain
56 get { return error_handlers_chain; }
59 public HandlersChain FinalizationChain
61 get { return finalize_handlers_chain; }
65 internal class HandlersChain
67 BaseRequestProcessorHandler chain;
69 public void ProcessRequestChain (MessageProcessingContext mrc)
72 chain.ProcessRequestChain (mrc);
75 public HandlersChain AddHandler (BaseRequestProcessorHandler handler)
81 BaseRequestProcessorHandler current = chain;
82 while (current.Next != null)
83 current = current.Next;
84 current.Next = handler;