CustomBindingElement.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Configuration
  5. {
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Configuration;
  9. using System.Runtime;
  10. using System.ServiceModel.Channels;
  11. public partial class CustomBindingElement
  12. : NamedServiceModelExtensionCollectionElement<BindingElementExtensionElement>,
  13. ICollection<BindingElementExtensionElement>,
  14. IBindingConfigurationElement
  15. {
  16. public CustomBindingElement()
  17. : this(null)
  18. { }
  19. public CustomBindingElement(string name) :
  20. base(ConfigurationStrings.BindingElementExtensions, name)
  21. { }
  22. [ConfigurationProperty(ConfigurationStrings.CloseTimeout, DefaultValue = ServiceDefaults.CloseTimeoutString)]
  23. [TypeConverter(typeof(TimeSpanOrInfiniteConverter))]
  24. [ServiceModelTimeSpanValidator(MinValueString = ConfigurationStrings.TimeSpanZero)]
  25. public TimeSpan CloseTimeout
  26. {
  27. get { return (TimeSpan)base[ConfigurationStrings.CloseTimeout]; }
  28. set
  29. {
  30. base[ConfigurationStrings.CloseTimeout] = value;
  31. this.SetIsModified();
  32. }
  33. }
  34. [ConfigurationProperty(ConfigurationStrings.OpenTimeout, DefaultValue = ServiceDefaults.OpenTimeoutString)]
  35. [TypeConverter(typeof(TimeSpanOrInfiniteConverter))]
  36. [ServiceModelTimeSpanValidator(MinValueString = ConfigurationStrings.TimeSpanZero)]
  37. public TimeSpan OpenTimeout
  38. {
  39. get { return (TimeSpan)base[ConfigurationStrings.OpenTimeout]; }
  40. set
  41. {
  42. base[ConfigurationStrings.OpenTimeout] = value;
  43. this.SetIsModified();
  44. }
  45. }
  46. [ConfigurationProperty(ConfigurationStrings.ReceiveTimeout, DefaultValue = ServiceDefaults.ReceiveTimeoutString)]
  47. [TypeConverter(typeof(TimeSpanOrInfiniteConverter))]
  48. [ServiceModelTimeSpanValidator(MinValueString = ConfigurationStrings.TimeSpanZero)]
  49. public TimeSpan ReceiveTimeout
  50. {
  51. get { return (TimeSpan)base[ConfigurationStrings.ReceiveTimeout]; }
  52. set
  53. {
  54. base[ConfigurationStrings.ReceiveTimeout] = value;
  55. this.SetIsModified();
  56. }
  57. }
  58. [ConfigurationProperty(ConfigurationStrings.SendTimeout, DefaultValue = ServiceDefaults.SendTimeoutString)]
  59. [TypeConverter(typeof(TimeSpanOrInfiniteConverter))]
  60. [ServiceModelTimeSpanValidator(MinValueString = ConfigurationStrings.TimeSpanZero)]
  61. public TimeSpan SendTimeout
  62. {
  63. get { return (TimeSpan)base[ConfigurationStrings.SendTimeout]; }
  64. set
  65. {
  66. base[ConfigurationStrings.SendTimeout] = value;
  67. this.SetIsModified();
  68. }
  69. }
  70. public override void Add(BindingElementExtensionElement element)
  71. {
  72. if (null == element)
  73. {
  74. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("element");
  75. }
  76. BindingElementExtensionElement existingElement = null;
  77. if (!this.CanAddEncodingElement(element, ref existingElement))
  78. {
  79. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigMessageEncodingAlreadyInBinding,
  80. existingElement.ConfigurationElementName,
  81. existingElement.GetType().AssemblyQualifiedName)));
  82. }
  83. else if (!this.CanAddStreamUpgradeElement(element, ref existingElement))
  84. {
  85. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigStreamUpgradeElementAlreadyInBinding,
  86. existingElement.ConfigurationElementName,
  87. existingElement.GetType().AssemblyQualifiedName)));
  88. }
  89. else if (!this.CanAddTransportElement(element, ref existingElement))
  90. {
  91. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigTransportAlreadyInBinding,
  92. existingElement.ConfigurationElementName,
  93. existingElement.GetType().AssemblyQualifiedName)));
  94. }
  95. else
  96. {
  97. base.Add(element);
  98. }
  99. }
  100. public void ApplyConfiguration(Binding binding)
  101. {
  102. if (null == binding)
  103. {
  104. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  105. }
  106. if (binding.GetType() != typeof(CustomBinding))
  107. {
  108. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.ConfigInvalidTypeForBinding,
  109. typeof(CustomBinding).AssemblyQualifiedName,
  110. binding.GetType().AssemblyQualifiedName));
  111. }
  112. binding.CloseTimeout = this.CloseTimeout;
  113. binding.OpenTimeout = this.OpenTimeout;
  114. binding.ReceiveTimeout = this.ReceiveTimeout;
  115. binding.SendTimeout = this.SendTimeout;
  116. this.OnApplyConfiguration(binding);
  117. }
  118. public override bool CanAdd(BindingElementExtensionElement element)
  119. {
  120. if (null == element)
  121. {
  122. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("element");
  123. }
  124. BindingElementExtensionElement existingElement = null;
  125. return !this.ContainsKey(element.GetType()) && this.CanAddEncodingElement(element, ref existingElement) &&
  126. this.CanAddStreamUpgradeElement(element, ref existingElement) && this.CanAddTransportElement(element, ref existingElement);
  127. }
  128. bool CanAddEncodingElement(BindingElementExtensionElement element, ref BindingElementExtensionElement existingElement)
  129. {
  130. return this.CanAddExclusiveElement(typeof(MessageEncodingBindingElement), element.BindingElementType, ref existingElement);
  131. }
  132. bool CanAddExclusiveElement(Type exclusiveType, Type bindingElementType, ref BindingElementExtensionElement existingElement)
  133. {
  134. bool retval = true;
  135. if (exclusiveType.IsAssignableFrom(bindingElementType))
  136. {
  137. foreach (BindingElementExtensionElement existing in this)
  138. {
  139. if (exclusiveType.IsAssignableFrom(existing.BindingElementType))
  140. {
  141. retval = false;
  142. existingElement = existing;
  143. break;
  144. }
  145. }
  146. }
  147. return retval;
  148. }
  149. bool CanAddStreamUpgradeElement(BindingElementExtensionElement element, ref BindingElementExtensionElement existingElement)
  150. {
  151. return this.CanAddExclusiveElement(typeof(StreamUpgradeBindingElement), element.BindingElementType, ref existingElement);
  152. }
  153. bool CanAddTransportElement(BindingElementExtensionElement element, ref BindingElementExtensionElement existingElement)
  154. {
  155. return this.CanAddExclusiveElement(typeof(TransportBindingElement), element.BindingElementType, ref existingElement);
  156. }
  157. protected void OnApplyConfiguration(Binding binding)
  158. {
  159. CustomBinding theBinding = (CustomBinding)binding;
  160. foreach (BindingElementExtensionElement bindingConfig in this)
  161. {
  162. theBinding.Elements.Add(bindingConfig.CreateBindingElement());
  163. }
  164. }
  165. }
  166. }