BaseRequestProcessor.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  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;
  7. using System.Text;
  8. namespace System.ServiceModel.Dispatcher
  9. {
  10. internal class BaseRequestProcessor
  11. {
  12. HandlersChain initialize_handlers_chain = new HandlersChain();
  13. HandlersChain process_handlers_chain = new HandlersChain ();
  14. HandlersChain error_handlers_chain = new HandlersChain ();
  15. HandlersChain finalize_handlers_chain = new HandlersChain ();
  16. protected BaseRequestProcessor () { }
  17. protected virtual void ProcessRequest (MessageProcessingContext mrc)
  18. {
  19. initialize_handlers_chain.ProcessRequestChain (mrc);
  20. using (new OperationContextScope (mrc.OperationContext)) {
  21. try {
  22. process_handlers_chain.ProcessRequestChain (mrc);
  23. }
  24. catch (Exception e) {
  25. Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);
  26. mrc.ProcessingException = e;
  27. error_handlers_chain.ProcessRequestChain (mrc);
  28. }
  29. finally {
  30. finalize_handlers_chain.ProcessRequestChain (mrc);
  31. }
  32. }
  33. }
  34. public HandlersChain InitializeChain
  35. {
  36. get { return initialize_handlers_chain; }
  37. }
  38. public HandlersChain ProcessingChain
  39. {
  40. get { return process_handlers_chain; }
  41. }
  42. public HandlersChain ErrorChain
  43. {
  44. get { return error_handlers_chain; }
  45. }
  46. public HandlersChain FinalizationChain
  47. {
  48. get { return finalize_handlers_chain; }
  49. }
  50. }
  51. internal class HandlersChain
  52. {
  53. BaseRequestProcessorHandler chain;
  54. public void ProcessRequestChain (MessageProcessingContext mrc)
  55. {
  56. if (chain != null)
  57. chain.ProcessRequestChain (mrc);
  58. }
  59. public HandlersChain AddHandler (BaseRequestProcessorHandler handler)
  60. {
  61. if (chain == null) {
  62. chain = handler;
  63. }
  64. else {
  65. BaseRequestProcessorHandler current = chain;
  66. while (current.Next != null)
  67. current = current.Next;
  68. current.Next = handler;
  69. }
  70. return this;
  71. }
  72. }
  73. }