TerminatingOperationBehavior.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Dispatcher
  5. {
  6. using System.Runtime;
  7. using System.ServiceModel.Channels;
  8. class TerminatingOperationBehavior
  9. {
  10. static void AbortChannel(object state)
  11. {
  12. ((IChannel)state).Abort();
  13. }
  14. public static TerminatingOperationBehavior CreateIfNecessary(DispatchRuntime dispatch)
  15. {
  16. if (IsTerminatingOperationBehaviorNeeded(dispatch))
  17. {
  18. return new TerminatingOperationBehavior();
  19. }
  20. else
  21. {
  22. return null;
  23. }
  24. }
  25. static bool IsTerminatingOperationBehaviorNeeded(DispatchRuntime dispatch)
  26. {
  27. for (int i = 0; i < dispatch.Operations.Count; i++)
  28. {
  29. DispatchOperation operation = dispatch.Operations[i];
  30. if (operation.IsTerminating)
  31. {
  32. return true;
  33. }
  34. }
  35. return false;
  36. }
  37. internal void AfterReply(ref MessageRpc rpc)
  38. {
  39. if (rpc.Operation.IsTerminating && rpc.Channel.HasSession)
  40. {
  41. IOThreadTimer timer = new IOThreadTimer(new Action<object>(TerminatingOperationBehavior.AbortChannel),
  42. rpc.Channel.Binder.Channel, false);
  43. timer.Set(rpc.Channel.CloseTimeout);
  44. }
  45. }
  46. internal static void AfterReply(ref ProxyRpc rpc)
  47. {
  48. if (rpc.Operation.IsTerminating && rpc.Channel.HasSession)
  49. {
  50. IChannel sessionChannel = rpc.Channel.Binder.Channel;
  51. rpc.Channel.Close(rpc.TimeoutHelper.RemainingTime());
  52. }
  53. }
  54. }
  55. }