2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
//------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace System.ServiceModel.Channels
|
|
|
|
{
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.ServiceModel.Description;
|
|
|
|
using System.Runtime.Serialization;
|
|
|
|
using System.ServiceModel.Security;
|
|
|
|
using System.ServiceModel;
|
|
|
|
using System.Xml;
|
|
|
|
using WsdlNS = System.Web.Services.Description;
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
|
|
public abstract class TransportBindingElement
|
|
|
|
: BindingElement
|
|
|
|
{
|
|
|
|
bool manualAddressing;
|
|
|
|
long maxBufferPoolSize;
|
|
|
|
long maxReceivedMessageSize;
|
|
|
|
|
|
|
|
protected TransportBindingElement()
|
|
|
|
{
|
|
|
|
this.manualAddressing = TransportDefaults.ManualAddressing;
|
|
|
|
this.maxBufferPoolSize = TransportDefaults.MaxBufferPoolSize;
|
|
|
|
this.maxReceivedMessageSize = TransportDefaults.MaxReceivedMessageSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected TransportBindingElement(TransportBindingElement elementToBeCloned)
|
|
|
|
: base(elementToBeCloned)
|
|
|
|
{
|
|
|
|
this.manualAddressing = elementToBeCloned.manualAddressing;
|
|
|
|
this.maxBufferPoolSize = elementToBeCloned.maxBufferPoolSize;
|
|
|
|
this.maxReceivedMessageSize = elementToBeCloned.maxReceivedMessageSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
[DefaultValue(TransportDefaults.ManualAddressing)]
|
|
|
|
public virtual bool ManualAddressing
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return this.manualAddressing;
|
|
|
|
}
|
|
|
|
|
|
|
|
set
|
|
|
|
{
|
|
|
|
this.manualAddressing = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[DefaultValue(TransportDefaults.MaxBufferPoolSize)]
|
|
|
|
public virtual long MaxBufferPoolSize
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return this.maxBufferPoolSize;
|
|
|
|
}
|
|
|
|
set
|
|
|
|
{
|
|
|
|
if (value < 0)
|
|
|
|
{
|
|
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
|
|
|
|
SR.GetString(SR.ValueMustBeNonNegative)));
|
|
|
|
}
|
|
|
|
this.maxBufferPoolSize = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[DefaultValue(TransportDefaults.MaxReceivedMessageSize)]
|
|
|
|
public virtual long MaxReceivedMessageSize
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return this.maxReceivedMessageSize;
|
|
|
|
}
|
|
|
|
set
|
|
|
|
{
|
|
|
|
if (value <= 0)
|
|
|
|
{
|
|
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
|
|
|
|
SR.GetString(SR.ValueMustBePositive)));
|
|
|
|
}
|
|
|
|
this.maxReceivedMessageSize = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public abstract string Scheme { get; }
|
|
|
|
|
|
|
|
internal static IChannelFactory<TChannel> CreateChannelFactory<TChannel>(TransportBindingElement transport)
|
|
|
|
{
|
|
|
|
Binding binding = new CustomBinding(transport);
|
|
|
|
return binding.BuildChannelFactory<TChannel>();
|
|
|
|
}
|
|
|
|
|
|
|
|
internal static IChannelListener CreateChannelListener<TChannel>(TransportBindingElement transport)
|
|
|
|
where TChannel : class, IChannel
|
|
|
|
{
|
|
|
|
Binding binding = new CustomBinding(transport);
|
|
|
|
return binding.BuildChannelListener<TChannel>();
|
|
|
|
}
|
|
|
|
|
|
|
|
public override T GetProperty<T>(BindingContext context)
|
|
|
|
{
|
|
|
|
if (context == null)
|
|
|
|
{
|
|
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof(T) == typeof(ChannelProtectionRequirements))
|
|
|
|
{
|
|
|
|
ChannelProtectionRequirements myRequirements = this.GetProtectionRequirements(context);
|
|
|
|
myRequirements.Add(context.GetInnerProperty<ChannelProtectionRequirements>() ?? new ChannelProtectionRequirements());
|
|
|
|
return (T)(object)myRequirements;
|
|
|
|
}
|
|
|
|
|
|
|
|
// to cover all our bases, let's iterate through the BindingParameters to make sure
|
|
|
|
// we haven't missed a query (since we're the Transport and we're at the bottom)
|
2017-08-21 15:34:15 +00:00
|
|
|
#pragma warning suppress 56506 // Microsoft, BindingContext.BindingParameters cannot be null
|
2016-08-03 10:59:49 +00:00
|
|
|
Collection<BindingElement> bindingElements = context.BindingParameters.FindAll<BindingElement>();
|
|
|
|
|
|
|
|
T result = default(T);
|
|
|
|
for (int i = 0; i < bindingElements.Count; i++)
|
|
|
|
{
|
|
|
|
result = bindingElements[i].GetIndividualProperty<T>();
|
|
|
|
if (result != default(T))
|
|
|
|
{
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof(T) == typeof(MessageVersion))
|
|
|
|
{
|
|
|
|
return (T)(object)TransportDefaults.GetDefaultMessageEncoderFactory().MessageVersion;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof(T) == typeof(XmlDictionaryReaderQuotas))
|
|
|
|
{
|
|
|
|
return (T)(object)new XmlDictionaryReaderQuotas();
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
ChannelProtectionRequirements GetProtectionRequirements(AddressingVersion addressingVersion)
|
|
|
|
{
|
|
|
|
ChannelProtectionRequirements result = new ChannelProtectionRequirements();
|
|
|
|
result.IncomingSignatureParts.AddParts(addressingVersion.SignedMessageParts);
|
|
|
|
result.OutgoingSignatureParts.AddParts(addressingVersion.SignedMessageParts);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal ChannelProtectionRequirements GetProtectionRequirements(BindingContext context)
|
|
|
|
{
|
|
|
|
AddressingVersion addressingVersion = AddressingVersion.WSAddressing10;
|
2017-08-21 15:34:15 +00:00
|
|
|
#pragma warning suppress 56506 // Microsoft, CustomBinding.Elements can never be null
|
2016-08-03 10:59:49 +00:00
|
|
|
MessageEncodingBindingElement messageEncoderBindingElement = context.Binding.Elements.Find<MessageEncodingBindingElement>();
|
|
|
|
if (messageEncoderBindingElement != null)
|
|
|
|
{
|
|
|
|
addressingVersion = messageEncoderBindingElement.MessageVersion.Addressing;
|
|
|
|
}
|
|
|
|
return GetProtectionRequirements(addressingVersion);
|
|
|
|
}
|
|
|
|
|
|
|
|
internal static void ExportWsdlEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext,
|
|
|
|
string wsdlTransportUri, AddressingVersion addressingVersion)
|
|
|
|
{
|
|
|
|
ExportWsdlEndpoint(exporter, endpointContext, wsdlTransportUri, endpointContext.Endpoint.Address, addressingVersion);
|
|
|
|
}
|
|
|
|
|
|
|
|
internal static void ExportWsdlEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext,
|
|
|
|
string wsdlTransportUri, EndpointAddress address, AddressingVersion addressingVersion)
|
|
|
|
{
|
|
|
|
if (exporter == null)
|
|
|
|
{
|
|
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (endpointContext == null)
|
|
|
|
{
|
|
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpointContext");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set SoapBinding Transport URI
|
2017-08-21 15:34:15 +00:00
|
|
|
#pragma warning suppress 56506 // Microsoft, these properties cannot be null in this context
|
2016-08-03 10:59:49 +00:00
|
|
|
BindingElementCollection bindingElements = endpointContext.Endpoint.Binding.CreateBindingElements();
|
|
|
|
if (wsdlTransportUri != null)
|
|
|
|
{
|
|
|
|
WsdlNS.SoapBinding soapBinding = SoapHelper.GetOrCreateSoapBinding(endpointContext, exporter);
|
|
|
|
|
|
|
|
if (soapBinding != null)
|
|
|
|
{
|
|
|
|
soapBinding.Transport = wsdlTransportUri;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (endpointContext.WsdlPort != null)
|
|
|
|
{
|
|
|
|
WsdlExporter.WSAddressingHelper.AddAddressToWsdlPort(endpointContext.WsdlPort, address, addressingVersion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
internal override bool IsMatch(BindingElement b)
|
|
|
|
{
|
|
|
|
if (b == null)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
TransportBindingElement transport = b as TransportBindingElement;
|
|
|
|
if (transport == null)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (this.maxBufferPoolSize != transport.MaxBufferPoolSize)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (this.maxReceivedMessageSize != transport.MaxReceivedMessageSize)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|