e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
275 lines
11 KiB
C#
275 lines
11 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.ServiceModel
|
|
{
|
|
using System;
|
|
using System.Configuration;
|
|
using System.Net;
|
|
using System.Runtime;
|
|
using System.ServiceModel.Channels;
|
|
using System.ServiceModel.Configuration;
|
|
using System.ServiceModel.PeerResolvers;
|
|
using System.Xml;
|
|
using System.ComponentModel;
|
|
|
|
|
|
[ObsoleteAttribute ("PeerChannel feature is obsolete and will be removed in the future.", false)]
|
|
public class NetPeerTcpBinding : Binding, IBindingRuntimePreferences
|
|
{
|
|
// private BindingElements
|
|
PeerTransportBindingElement transport;
|
|
PeerResolverSettings resolverSettings;
|
|
BinaryMessageEncodingBindingElement encoding;
|
|
PeerSecuritySettings peerSecurity;
|
|
|
|
public NetPeerTcpBinding() { Initialize(); }
|
|
public NetPeerTcpBinding(string configurationName) : this() { ApplyConfiguration(configurationName); }
|
|
|
|
static public bool IsPnrpAvailable
|
|
{
|
|
get
|
|
{
|
|
return PnrpPeerResolver.IsPnrpAvailable;
|
|
}
|
|
}
|
|
|
|
[DefaultValue(TransportDefaults.MaxBufferPoolSize)]
|
|
public long MaxBufferPoolSize
|
|
{
|
|
get { return transport.MaxBufferPoolSize; }
|
|
set
|
|
{
|
|
transport.MaxBufferPoolSize = value;
|
|
}
|
|
}
|
|
|
|
[DefaultValue(TransportDefaults.MaxReceivedMessageSize)]
|
|
public long MaxReceivedMessageSize
|
|
{
|
|
get { return transport.MaxReceivedMessageSize; }
|
|
set { transport.MaxReceivedMessageSize = value; }
|
|
}
|
|
|
|
[DefaultValue(PeerTransportDefaults.ListenIPAddress)]
|
|
[TypeConverter(typeof(PeerTransportListenAddressConverter))]
|
|
public IPAddress ListenIPAddress
|
|
{
|
|
get { return transport.ListenIPAddress; }
|
|
set { transport.ListenIPAddress = value; }
|
|
}
|
|
|
|
public PeerSecuritySettings Security
|
|
{
|
|
get { return peerSecurity; }
|
|
set
|
|
{
|
|
if (value == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
|
|
this.peerSecurity = value;
|
|
}
|
|
}
|
|
|
|
[DefaultValue(PeerTransportDefaults.Port)]
|
|
public int Port
|
|
{
|
|
get { return transport.Port; }
|
|
set { transport.Port = value; }
|
|
}
|
|
|
|
public XmlDictionaryReaderQuotas ReaderQuotas
|
|
{
|
|
get { return encoding.ReaderQuotas; }
|
|
set
|
|
{
|
|
if (value == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
|
|
value.CopyTo(encoding.ReaderQuotas);
|
|
}
|
|
}
|
|
|
|
public PeerResolverSettings Resolver
|
|
{
|
|
get { return this.resolverSettings; }
|
|
}
|
|
|
|
bool IBindingRuntimePreferences.ReceiveSynchronously
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public override string Scheme { get { return transport.Scheme; } }
|
|
|
|
// Soap version supported by this binding
|
|
public EnvelopeVersion EnvelopeVersion
|
|
{
|
|
get { return EnvelopeVersion.Soap12; }
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
this.resolverSettings = new PeerResolverSettings();
|
|
transport = new PeerTransportBindingElement();
|
|
encoding = new BinaryMessageEncodingBindingElement();
|
|
peerSecurity = new PeerSecuritySettings();
|
|
}
|
|
|
|
void InitializeFrom(PeerTransportBindingElement transport, BinaryMessageEncodingBindingElement encoding)
|
|
{
|
|
Fx.Assert(transport != null, "Invalid null transport.");
|
|
Fx.Assert(encoding != null, "Invalid null encoding.");
|
|
|
|
this.MaxBufferPoolSize = transport.MaxBufferPoolSize;
|
|
this.MaxReceivedMessageSize = transport.MaxReceivedMessageSize;
|
|
this.ListenIPAddress = transport.ListenIPAddress;
|
|
this.Port = transport.Port;
|
|
this.Security.Mode = transport.Security.Mode;
|
|
this.ReaderQuotas = encoding.ReaderQuotas;
|
|
}
|
|
|
|
// check that properties of the HttpTransportBindingElement and
|
|
// MessageEncodingBindingElement not exposed as properties on BasicHttpBinding
|
|
// match default values of the binding elements
|
|
bool IsBindingElementsMatch(PeerTransportBindingElement transport, BinaryMessageEncodingBindingElement encoding)
|
|
{
|
|
if (!this.transport.IsMatch(transport))
|
|
return false;
|
|
if (!this.encoding.IsMatch(encoding))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
void ApplyConfiguration(string configurationName)
|
|
{
|
|
NetPeerTcpBindingCollectionElement section = NetPeerTcpBindingCollectionElement.GetBindingCollectionElement();
|
|
NetPeerTcpBindingElement element = section.Bindings[configurationName];
|
|
this.resolverSettings = new PeerResolverSettings();
|
|
if (element == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(
|
|
SR.GetString(SR.ConfigInvalidBindingConfigurationName,
|
|
configurationName,
|
|
ConfigurationStrings.NetPeerTcpBindingCollectionElementName)));
|
|
}
|
|
else
|
|
{
|
|
element.ApplyConfiguration(this);
|
|
}
|
|
this.transport.CreateDefaultResolver(this.Resolver);
|
|
}
|
|
|
|
public override BindingElementCollection CreateBindingElements()
|
|
{
|
|
BindingElementCollection bindingElements = new BindingElementCollection();
|
|
switch (this.Resolver.Mode)
|
|
{
|
|
case PeerResolverMode.Auto:
|
|
{
|
|
if (CanUseCustomResolver())
|
|
bindingElements.Add(new PeerCustomResolverBindingElement(this.Resolver.Custom));
|
|
else if (PeerTransportDefaults.ResolverAvailable)
|
|
bindingElements.Add(new PnrpPeerResolverBindingElement(this.Resolver.ReferralPolicy));
|
|
else
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.PeerResolverRequired)));
|
|
}
|
|
break;
|
|
case PeerResolverMode.Custom:
|
|
{
|
|
if (CanUseCustomResolver())
|
|
bindingElements.Add(new PeerCustomResolverBindingElement(this.Resolver.Custom));
|
|
else
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.PeerResolverSettingsInvalid)));
|
|
}
|
|
break;
|
|
case PeerResolverMode.Pnrp:
|
|
{
|
|
if (PeerTransportDefaults.ResolverAvailable)
|
|
bindingElements.Add(new PnrpPeerResolverBindingElement(this.Resolver.ReferralPolicy));
|
|
else
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.PeerResolverRequired)));
|
|
}
|
|
break;
|
|
default:
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.PeerResolverRequired)));
|
|
}
|
|
|
|
bindingElements.Add(encoding);
|
|
bindingElements.Add(transport);
|
|
transport.Security.Mode = this.Security.Mode;
|
|
transport.Security.Transport.CredentialType = this.Security.Transport.CredentialType;
|
|
|
|
return bindingElements.Clone();
|
|
}
|
|
|
|
internal static bool TryCreate(BindingElementCollection elements, out Binding binding)
|
|
{
|
|
binding = null;
|
|
if (elements.Count != 3)
|
|
return false;
|
|
|
|
PeerResolverBindingElement resolver = null;
|
|
PeerTransportBindingElement transport = null;
|
|
BinaryMessageEncodingBindingElement encoding = null;
|
|
|
|
foreach (BindingElement element in elements)
|
|
{
|
|
if (element is TransportBindingElement)
|
|
transport = element as PeerTransportBindingElement;
|
|
else if (element is BinaryMessageEncodingBindingElement)
|
|
encoding = element as BinaryMessageEncodingBindingElement;
|
|
else if (element is PeerResolverBindingElement)
|
|
resolver = element as PeerResolverBindingElement;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
if (transport == null)
|
|
return false;
|
|
|
|
if (encoding == null)
|
|
return false;
|
|
|
|
if (resolver == null)
|
|
return false;
|
|
|
|
NetPeerTcpBinding netPeerTcpBinding = new NetPeerTcpBinding();
|
|
netPeerTcpBinding.InitializeFrom(transport, encoding);
|
|
if (!netPeerTcpBinding.IsBindingElementsMatch(transport, encoding))
|
|
return false;
|
|
|
|
PeerCustomResolverBindingElement customResolver = resolver as PeerCustomResolverBindingElement;
|
|
if (customResolver != null)
|
|
{
|
|
netPeerTcpBinding.Resolver.Custom.Address = customResolver.Address;
|
|
netPeerTcpBinding.Resolver.Custom.Binding = customResolver.Binding;
|
|
netPeerTcpBinding.Resolver.Custom.Resolver = customResolver.CreatePeerResolver();
|
|
}
|
|
else if (resolver is PnrpPeerResolverBindingElement)
|
|
{
|
|
|
|
if (NetPeerTcpBinding.IsPnrpAvailable)
|
|
netPeerTcpBinding.Resolver.Mode = PeerResolverMode.Pnrp;
|
|
}
|
|
binding = netPeerTcpBinding;
|
|
return true;
|
|
}
|
|
|
|
bool CanUseCustomResolver()
|
|
{
|
|
return (this.Resolver.Custom.Resolver != null || (this.Resolver.Custom.IsBindingSpecified && this.Resolver.Custom.Address != null));
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeReaderQuotas()
|
|
{
|
|
return (!EncoderDefaults.IsDefaultReaderQuotas(this.ReaderQuotas));
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeSecurity()
|
|
{
|
|
return this.Security.InternalShouldSerialize();
|
|
}
|
|
}
|
|
}
|