-using System;\r
-using System.Collections.Generic;\r
-using System.ServiceModel;\r
-using System.ServiceModel.Channels;\r
-using System.ServiceModel.Security;\r
-using System.ServiceModel.Security.Tokens;\r
-using System.Text;\r
-\r
-namespace System.ServiceModel.Dispatcher\r
-{\r
- internal class BaseRequestProcessor\r
- {\r
- HandlersChain initialize_handlers_chain = new HandlersChain();\r
- HandlersChain process_handlers_chain = new HandlersChain ();\r
- HandlersChain error_handlers_chain = new HandlersChain ();\r
- HandlersChain finalize_handlers_chain = new HandlersChain ();\r
-\r
- protected BaseRequestProcessor () { }\r
-\r
- protected virtual void ProcessRequest (MessageProcessingContext mrc)\r
- {\r
- initialize_handlers_chain.ProcessRequestChain (mrc);\r
-\r
- using (new OperationContextScope (mrc.OperationContext)) {\r
- try {\r
- process_handlers_chain.ProcessRequestChain (mrc);\r
- }\r
- catch (Exception e) {\r
- Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);\r
- mrc.ProcessingException = e;\r
- error_handlers_chain.ProcessRequestChain (mrc);\r
- }\r
- finally {\r
- finalize_handlers_chain.ProcessRequestChain (mrc);\r
- }\r
- }\r
- }\r
-\r
- public HandlersChain InitializeChain\r
- {\r
- get { return initialize_handlers_chain; }\r
- }\r
-\r
- public HandlersChain ProcessingChain\r
- {\r
- get { return process_handlers_chain; }\r
- }\r
-\r
- public HandlersChain ErrorChain\r
- {\r
- get { return error_handlers_chain; }\r
- }\r
-\r
- public HandlersChain FinalizationChain\r
- {\r
- get { return finalize_handlers_chain; }\r
- } \r
- }\r
-\r
- internal class HandlersChain\r
- {\r
- BaseRequestProcessorHandler chain;\r
-\r
- public void ProcessRequestChain (MessageProcessingContext mrc)\r
- {\r
- if (chain != null)\r
- chain.ProcessRequestChain (mrc);\r
- }\r
-\r
- public HandlersChain AddHandler (BaseRequestProcessorHandler handler)\r
- {\r
- if (chain == null) {\r
- chain = handler;\r
- }\r
- else {\r
- BaseRequestProcessorHandler current = chain;\r
- while (current.Next != null)\r
- current = current.Next;\r
- current.Next = handler;\r
- }\r
- return this;\r
- }\r
- }\r
-}\r
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Security;
+using System.ServiceModel.Security.Tokens;
+using System.Text;
+
+namespace System.ServiceModel.Dispatcher
+{
+ internal class BaseRequestProcessor
+ {
+ HandlersChain initialize_handlers_chain = new HandlersChain();
+ HandlersChain process_handlers_chain = new HandlersChain ();
+ HandlersChain error_handlers_chain = new HandlersChain ();
+ HandlersChain finalize_handlers_chain = new HandlersChain ();
+
+ protected BaseRequestProcessor () { }
+
+ protected virtual void ProcessRequest (MessageProcessingContext mrc)
+ {
+ initialize_handlers_chain.ProcessRequestChain (mrc);
+
+ using (new OperationContextScope (mrc.OperationContext)) {
+ try {
+ process_handlers_chain.ProcessRequestChain (mrc);
+ }
+ catch (Exception e) {
+ // FIXME: this is not really expected use of ChannelDispatcher.ErrorHandlers.
+ // They are now correctly used in process_handler_chain (namely OperationInvokerHandler).
+ // For this kind of "outsider" exceptions are actually left thrown
+ // (and could even cause server loop crash in .NET).
+
+ Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);
+ mrc.ProcessingException = e;
+ error_handlers_chain.ProcessRequestChain (mrc);
+ }
+ finally {
+ finalize_handlers_chain.ProcessRequestChain (mrc);
+ }
+ }
+ }
+
+ public HandlersChain InitializeChain
+ {
+ get { return initialize_handlers_chain; }
+ }
+
+ public HandlersChain ProcessingChain
+ {
+ get { return process_handlers_chain; }
+ }
+
+ public HandlersChain ErrorChain
+ {
+ get { return error_handlers_chain; }
+ }
+
+ public HandlersChain FinalizationChain
+ {
+ get { return finalize_handlers_chain; }
+ }
+ }
+
+ internal class HandlersChain
+ {
+ BaseRequestProcessorHandler chain;
+
+ public void ProcessRequestChain (MessageProcessingContext mrc)
+ {
+ if (chain != null)
+ chain.ProcessRequestChain (mrc);
+ }
+
+ public HandlersChain AddHandler (BaseRequestProcessorHandler handler)
+ {
+ if (chain == null) {
+ chain = handler;
+ }
+ else {
+ BaseRequestProcessorHandler current = chain;
+ while (current.Next != null)
+ current = current.Next;
+ current.Next = handler;
+ }
+ return this;
+ }
+ }
+}