2016-08-03 10:59:49 +00:00
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel
{
using System ;
using System.Configuration ;
using System.ServiceModel.Channels ;
using System.ServiceModel.Configuration ;
using System.ServiceModel.Description ;
using System.Text ;
using System.Xml ;
using System.ComponentModel ;
public class WebHttpBinding : Binding , IBindingRuntimePreferences
{
HttpsTransportBindingElement httpsTransportBindingElement ;
// private BindingElements
HttpTransportBindingElement httpTransportBindingElement ;
WebHttpSecurity security = new WebHttpSecurity ( ) ;
WebMessageEncodingBindingElement webMessageEncodingBindingElement ;
public WebHttpBinding ( ) : base ( )
{
Initialize ( ) ;
}
public WebHttpBinding ( string configurationName ) : this ( )
{
ApplyConfiguration ( configurationName ) ;
}
public WebHttpBinding ( WebHttpSecurityMode securityMode ) : base ( )
{
Initialize ( ) ;
this . security . Mode = securityMode ;
}
[DefaultValue(HttpTransportDefaults.AllowCookies)]
public bool AllowCookies
{
get { return httpTransportBindingElement . AllowCookies ; }
set
{
httpTransportBindingElement . AllowCookies = value ;
httpsTransportBindingElement . AllowCookies = value ;
}
}
[DefaultValue(HttpTransportDefaults.BypassProxyOnLocal)]
public bool BypassProxyOnLocal
{
get { return httpTransportBindingElement . BypassProxyOnLocal ; }
set
{
httpTransportBindingElement . BypassProxyOnLocal = value ;
httpsTransportBindingElement . BypassProxyOnLocal = value ;
}
}
public EnvelopeVersion EnvelopeVersion
{
get { return EnvelopeVersion . None ; }
}
[DefaultValue(HttpTransportDefaults.HostNameComparisonMode)]
public HostNameComparisonMode HostNameComparisonMode
{
get { return httpTransportBindingElement . HostNameComparisonMode ; }
set
{
httpTransportBindingElement . HostNameComparisonMode = value ;
httpsTransportBindingElement . HostNameComparisonMode = value ;
}
}
[DefaultValue(TransportDefaults.MaxBufferPoolSize)]
public long MaxBufferPoolSize
{
get { return httpTransportBindingElement . MaxBufferPoolSize ; }
set
{
httpTransportBindingElement . MaxBufferPoolSize = value ;
httpsTransportBindingElement . MaxBufferPoolSize = value ;
}
}
[DefaultValue(TransportDefaults.MaxBufferSize)]
public int MaxBufferSize
{
get { return httpTransportBindingElement . MaxBufferSize ; }
set
{
httpTransportBindingElement . MaxBufferSize = value ;
httpsTransportBindingElement . MaxBufferSize = value ;
}
}
[DefaultValue(TransportDefaults.MaxReceivedMessageSize)]
public long MaxReceivedMessageSize
{
get { return httpTransportBindingElement . MaxReceivedMessageSize ; }
set
{
httpTransportBindingElement . MaxReceivedMessageSize = value ;
httpsTransportBindingElement . MaxReceivedMessageSize = value ;
}
}
[DefaultValue(HttpTransportDefaults.ProxyAddress)]
public Uri ProxyAddress
{
get { return httpTransportBindingElement . ProxyAddress ; }
set
{
httpTransportBindingElement . ProxyAddress = value ;
httpsTransportBindingElement . ProxyAddress = value ;
}
}
public XmlDictionaryReaderQuotas ReaderQuotas
{
get { return webMessageEncodingBindingElement . ReaderQuotas ; }
set
{
if ( value = = null )
{
throw DiagnosticUtility . ExceptionUtility . ThrowHelperArgumentNull ( "value" ) ;
}
value . CopyTo ( webMessageEncodingBindingElement . ReaderQuotas ) ;
}
}
public override string Scheme
{ get { return GetTransport ( ) . Scheme ; } }
public WebHttpSecurity Security
{
get { return this . security ; }
set
{
if ( value = = null )
throw DiagnosticUtility . ExceptionUtility . ThrowHelperArgumentNull ( "value" ) ;
this . security = value ;
}
}
[DefaultValue(HttpTransportDefaults.TransferMode)]
public TransferMode TransferMode
{
get { return httpTransportBindingElement . TransferMode ; }
set
{
httpTransportBindingElement . TransferMode = value ;
httpsTransportBindingElement . TransferMode = value ;
}
}
[DefaultValue(HttpTransportDefaults.UseDefaultWebProxy)]
public bool UseDefaultWebProxy
{
get { return httpTransportBindingElement . UseDefaultWebProxy ; }
set
{
httpTransportBindingElement . UseDefaultWebProxy = value ;
httpsTransportBindingElement . UseDefaultWebProxy = value ;
}
}
[TypeConverter(typeof(EncodingConverter))]
public Encoding WriteEncoding
{
get { return webMessageEncodingBindingElement . WriteEncoding ; }
set
{
webMessageEncodingBindingElement . WriteEncoding = value ;
}
}
public WebContentTypeMapper ContentTypeMapper
{
get { return webMessageEncodingBindingElement . ContentTypeMapper ; }
set
{
webMessageEncodingBindingElement . ContentTypeMapper = value ;
}
}
public bool CrossDomainScriptAccessEnabled
{
get { return webMessageEncodingBindingElement . CrossDomainScriptAccessEnabled ; }
set
{
webMessageEncodingBindingElement . CrossDomainScriptAccessEnabled = value ;
}
}
2017-08-21 15:34:15 +00:00
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] // Microsoft, This is the pattern we use on the standard bindings in Indigo V1
2016-08-03 10:59:49 +00:00
bool IBindingRuntimePreferences . ReceiveSynchronously
{
get { return false ; }
}
public override IChannelFactory < TChannel > BuildChannelFactory < TChannel > ( BindingParameterCollection parameters )
{
if ( ( security . Mode = = WebHttpSecurityMode . Transport | |
security . Mode = = WebHttpSecurityMode . TransportCredentialOnly ) & &
security . Transport . ClientCredentialType = = HttpClientCredentialType . InheritedFromHost )
{
throw DiagnosticUtility . ExceptionUtility . ThrowHelperError ( new InvalidOperationException ( SR . GetString ( SR . HttpClientCredentialTypeInvalid , security . Transport . ClientCredentialType ) ) ) ;
}
return base . BuildChannelFactory < TChannel > ( parameters ) ;
}
public override BindingElementCollection CreateBindingElements ( )
{
// return collection of BindingElements
BindingElementCollection bindingElements = new BindingElementCollection ( ) ;
// order of BindingElements is important
// add encoding
bindingElements . Add ( webMessageEncodingBindingElement ) ;
// add transport (http or https)
bindingElements . Add ( GetTransport ( ) ) ;
return bindingElements . Clone ( ) ;
}
void ApplyConfiguration ( string configurationName )
{
WebHttpBindingCollectionElement section = WebHttpBindingCollectionElement . GetBindingCollectionElement ( ) ;
WebHttpBindingElement element = section . Bindings [ configurationName ] ;
if ( element = = null )
{
throw DiagnosticUtility . ExceptionUtility . ThrowHelperError ( new ConfigurationErrorsException (
SR2 . GetString ( SR2 . ConfigInvalidBindingConfigurationName ,
configurationName ,
WebHttpBindingConfigurationStrings . WebHttpBindingCollectionElementName ) ) ) ;
}
else
{
element . ApplyConfiguration ( this ) ;
}
}
TransportBindingElement GetTransport ( )
{
if ( security . Mode = = WebHttpSecurityMode . Transport )
{
security . EnableTransportSecurity ( httpsTransportBindingElement ) ;
return httpsTransportBindingElement ;
}
else if ( security . Mode = = WebHttpSecurityMode . TransportCredentialOnly )
{
security . EnableTransportAuthentication ( httpTransportBindingElement ) ;
return httpTransportBindingElement ;
}
else
{
// ensure that there is no transport security
security . DisableTransportAuthentication ( httpTransportBindingElement ) ;
return httpTransportBindingElement ;
}
}
void Initialize ( )
{
httpTransportBindingElement = new HttpTransportBindingElement ( ) ;
httpsTransportBindingElement = new HttpsTransportBindingElement ( ) ;
httpTransportBindingElement . ManualAddressing = true ;
httpsTransportBindingElement . ManualAddressing = true ;
webMessageEncodingBindingElement = new WebMessageEncodingBindingElement ( ) ;
webMessageEncodingBindingElement . MessageVersion = MessageVersion . None ;
}
internal static class WebHttpBindingConfigurationStrings
{
internal const string WebHttpBindingCollectionElementName = "webHttpBinding" ;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeReaderQuotas ( )
{
return ( ! EncoderDefaults . IsDefaultReaderQuotas ( this . ReaderQuotas ) ) ;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeWriteEncoding ( )
{
return ( this . WriteEncoding ! = TextEncoderDefaults . Encoding ) ;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeSecurity ( )
{
return Security . InternalShouldSerialize ( ) ;
}
}
}