BasicHttpBinding.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System;
  7. using System.ComponentModel;
  8. using System.Configuration;
  9. using System.Runtime;
  10. using System.ServiceModel.Channels;
  11. using System.ServiceModel.Configuration;
  12. using System.Xml;
  13. public class BasicHttpBinding : HttpBindingBase
  14. {
  15. WSMessageEncoding messageEncoding = BasicHttpBindingDefaults.MessageEncoding;
  16. BasicHttpSecurity basicHttpSecurity;
  17. public BasicHttpBinding() : this(BasicHttpSecurityMode.None) { }
  18. public BasicHttpBinding(string configurationName) : base()
  19. {
  20. this.Initialize();
  21. this.ApplyConfiguration(configurationName);
  22. }
  23. public BasicHttpBinding(BasicHttpSecurityMode securityMode)
  24. : base()
  25. {
  26. this.Initialize();
  27. this.basicHttpSecurity.Mode = securityMode;
  28. }
  29. BasicHttpBinding(BasicHttpSecurity security)
  30. : base()
  31. {
  32. this.Initialize();
  33. this.basicHttpSecurity = security;
  34. }
  35. [DefaultValue(WSMessageEncoding.Text)]
  36. public WSMessageEncoding MessageEncoding
  37. {
  38. get { return messageEncoding; }
  39. set { messageEncoding = value; }
  40. }
  41. public BasicHttpSecurity Security
  42. {
  43. get { return this.basicHttpSecurity; }
  44. set
  45. {
  46. if (value == null)
  47. {
  48. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
  49. }
  50. this.basicHttpSecurity = value;
  51. }
  52. }
  53. [Obsolete(HttpChannelUtilities.ObsoleteDescriptionStrings.PropertyObsoleteUseAllowCookies, false)]
  54. [EditorBrowsable(EditorBrowsableState.Never)]
  55. public bool EnableHttpCookieContainer
  56. {
  57. get
  58. {
  59. return this.AllowCookies;
  60. }
  61. set
  62. {
  63. this.AllowCookies = value;
  64. }
  65. }
  66. internal override BasicHttpSecurity BasicHttpSecurity
  67. {
  68. get
  69. {
  70. return this.basicHttpSecurity;
  71. }
  72. }
  73. // check that properties of the HttpTransportBindingElement and
  74. // MessageEncodingBindingElement not exposed as properties on BasicHttpBinding
  75. // match default values of the binding elements
  76. bool IsBindingElementsMatch(HttpTransportBindingElement transport, MessageEncodingBindingElement encoding)
  77. {
  78. if (this.MessageEncoding == WSMessageEncoding.Text)
  79. {
  80. if (!this.TextMessageEncodingBindingElement.IsMatch(encoding))
  81. return false;
  82. }
  83. else if (this.MessageEncoding == WSMessageEncoding.Mtom)
  84. {
  85. if (!this.MtomMessageEncodingBindingElement.IsMatch(encoding))
  86. return false;
  87. }
  88. if (!this.GetTransport().IsMatch(transport))
  89. return false;
  90. return true;
  91. }
  92. internal override EnvelopeVersion GetEnvelopeVersion()
  93. {
  94. return EnvelopeVersion.Soap11;
  95. }
  96. internal override void InitializeFrom(HttpTransportBindingElement transport, MessageEncodingBindingElement encoding)
  97. {
  98. base.InitializeFrom(transport, encoding);
  99. // BasicHttpBinding only supports Text and Mtom encoding
  100. if (encoding is TextMessageEncodingBindingElement)
  101. {
  102. this.MessageEncoding = WSMessageEncoding.Text;
  103. }
  104. else if (encoding is MtomMessageEncodingBindingElement)
  105. {
  106. messageEncoding = WSMessageEncoding.Mtom;
  107. }
  108. }
  109. void ApplyConfiguration(string configurationName)
  110. {
  111. BasicHttpBindingCollectionElement section = BasicHttpBindingCollectionElement.GetBindingCollectionElement();
  112. BasicHttpBindingElement element = section.Bindings[configurationName];
  113. if (element == null)
  114. {
  115. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(
  116. SR.GetString(SR.ConfigInvalidBindingConfigurationName,
  117. configurationName,
  118. ConfigurationStrings.BasicHttpBindingCollectionElementName)));
  119. }
  120. else
  121. {
  122. element.ApplyConfiguration(this);
  123. }
  124. }
  125. public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingParameterCollection parameters)
  126. {
  127. if ((this.BasicHttpSecurity.Mode == BasicHttpSecurityMode.Transport ||
  128. this.BasicHttpSecurity.Mode == BasicHttpSecurityMode.TransportCredentialOnly) &&
  129. this.BasicHttpSecurity.Transport.ClientCredentialType == HttpClientCredentialType.InheritedFromHost)
  130. {
  131. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.HttpClientCredentialTypeInvalid, this.BasicHttpSecurity.Transport.ClientCredentialType)));
  132. }
  133. return base.BuildChannelFactory<TChannel>(parameters);
  134. }
  135. public override BindingElementCollection CreateBindingElements()
  136. {
  137. this.CheckSettings();
  138. // return collection of BindingElements
  139. BindingElementCollection bindingElements = new BindingElementCollection();
  140. // order of BindingElements is important
  141. // add security (*optional)
  142. SecurityBindingElement wsSecurity = this.BasicHttpSecurity.CreateMessageSecurity();
  143. if (wsSecurity != null)
  144. {
  145. bindingElements.Add(wsSecurity);
  146. }
  147. // add encoding (text or mtom)
  148. WSMessageEncodingHelper.SyncUpEncodingBindingElementProperties(this.TextMessageEncodingBindingElement, this.MtomMessageEncodingBindingElement);
  149. if (this.MessageEncoding == WSMessageEncoding.Text)
  150. bindingElements.Add(this.TextMessageEncodingBindingElement);
  151. else if (this.MessageEncoding == WSMessageEncoding.Mtom)
  152. bindingElements.Add(this.MtomMessageEncodingBindingElement);
  153. // add transport (http or https)
  154. bindingElements.Add(this.GetTransport());
  155. return bindingElements.Clone();
  156. }
  157. internal static bool TryCreate(BindingElementCollection elements, out Binding binding)
  158. {
  159. binding = null;
  160. if (elements.Count > 3)
  161. return false;
  162. SecurityBindingElement securityElement = null;
  163. MessageEncodingBindingElement encoding = null;
  164. HttpTransportBindingElement transport = null;
  165. foreach (BindingElement element in elements)
  166. {
  167. if (element is SecurityBindingElement)
  168. securityElement = element as SecurityBindingElement;
  169. else if (element is TransportBindingElement)
  170. transport = element as HttpTransportBindingElement;
  171. else if (element is MessageEncodingBindingElement)
  172. encoding = element as MessageEncodingBindingElement;
  173. else
  174. return false;
  175. }
  176. HttpsTransportBindingElement httpsTransport = transport as HttpsTransportBindingElement;
  177. if ( ( securityElement != null ) && ( httpsTransport != null ) && ( httpsTransport.RequireClientCertificate != TransportDefaults.RequireClientCertificate ) )
  178. {
  179. return false;
  180. }
  181. // process transport binding element
  182. UnifiedSecurityMode mode;
  183. HttpTransportSecurity transportSecurity = new HttpTransportSecurity();
  184. if (!GetSecurityModeFromTransport(transport, transportSecurity, out mode))
  185. return false;
  186. if (encoding == null)
  187. return false;
  188. // BasicHttpBinding only supports Soap11
  189. if (!encoding.CheckEncodingVersion(EnvelopeVersion.Soap11))
  190. return false;
  191. BasicHttpSecurity security;
  192. if (!TryCreateSecurity(securityElement, mode, transportSecurity, out security))
  193. return false;
  194. BasicHttpBinding basicHttpBinding = new BasicHttpBinding(security);
  195. basicHttpBinding.InitializeFrom(transport, encoding);
  196. // make sure all our defaults match
  197. if (!basicHttpBinding.IsBindingElementsMatch(transport, encoding))
  198. return false;
  199. binding = basicHttpBinding;
  200. return true;
  201. }
  202. [EditorBrowsable(EditorBrowsableState.Never)]
  203. public bool ShouldSerializeSecurity()
  204. {
  205. return this.Security.InternalShouldSerialize();
  206. }
  207. [EditorBrowsable(EditorBrowsableState.Never)]
  208. public bool ShouldSerializeEnableHttpCookieContainer()
  209. {
  210. return false;
  211. }
  212. void Initialize()
  213. {
  214. this.basicHttpSecurity = new BasicHttpSecurity();
  215. }
  216. }
  217. }