File: FrameworkFork\System.ServiceModel\System\ServiceModel\Channels\TransportDefaults.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Net;
using System.Net.Security;
using System.Net.WebSockets;
using System.Runtime;
using System.Security.Authentication;
using System.Security.Principal;
using System.ServiceModel.Security;
using System.Text;
using Microsoft.Xml;
 
namespace System.ServiceModel.Channels
{
    // If any of the const's are modified in this file, they must also be modified
    // on the Internal.ServiceModel.Primitives contract and implementation assemblies.
 
    internal static class TransactionFlowDefaults
    {
        internal const TransactionFlowOption IssuedTokens = TransactionFlowOption.NotAllowed;
        internal const bool Transactions = false;
        internal static TransactionProtocol TransactionProtocol = System.ServiceModel.TransactionProtocol.OleTransactions;
    }
 
    public static class EncoderDefaults
    {
        public const int MaxReadPoolSize = 64;
        public const int MaxWritePoolSize = 16;
 
        public const int MaxDepth = 32;
        public const int MaxStringContentLength = 8192;
        public const int MaxArrayLength = 16384;
        public const int MaxBytesPerRead = 4096;
        public const int MaxNameTableCharCount = 16384;
 
        public const int BufferedReadDefaultMaxDepth = 128;
        public const int BufferedReadDefaultMaxStringContentLength = Int32.MaxValue;
        public const int BufferedReadDefaultMaxArrayLength = Int32.MaxValue;
        public const int BufferedReadDefaultMaxBytesPerRead = Int32.MaxValue;
        public const int BufferedReadDefaultMaxNameTableCharCount = Int32.MaxValue;
 
        public const CompressionFormat DefaultCompressionFormat = CompressionFormat.None;
 
        public static readonly XmlDictionaryReaderQuotas ReaderQuotas = new XmlDictionaryReaderQuotas();
 
        public static bool IsDefaultReaderQuotas(XmlDictionaryReaderQuotas quotas)
        {
            return quotas.ModifiedQuotas == 0x00;
        }
    }
 
    public static class TextEncoderDefaults
    {
        public static readonly Encoding Encoding = Encoding.GetEncoding(TextEncoderDefaults.EncodingString);
        public const string EncodingString = "utf-8";
        public static readonly Encoding[] SupportedEncodings = new Encoding[] { Encoding.UTF8, Encoding.Unicode, Encoding.BigEndianUnicode };
        public const string MessageVersionString = "Soap12WSAddressing10";
        // Desktop: System.ServiceModel.Configuration.ConfigurationStrings.Soap12WSAddressing10;
        public static readonly CharSetEncoding[] CharSetEncodings = new CharSetEncoding[]
        {
            new CharSetEncoding("utf-8", Encoding.UTF8),
            new CharSetEncoding("utf-16LE", Encoding.Unicode),
            new CharSetEncoding("utf-16BE", Encoding.BigEndianUnicode),
            new CharSetEncoding("utf-16", null),   // Ignore.  Ambiguous charSet, so autodetect.
            new CharSetEncoding(null, null),       // CharSet omitted, so autodetect.
        };
 
        public static void ValidateEncoding(Encoding encoding)
        {
            string charSet = encoding.WebName;
            Encoding[] supportedEncodings = SupportedEncodings;
            for (int i = 0; i < supportedEncodings.Length; i++)
            {
                if (charSet == supportedEncodings[i].WebName)
                    return;
            }
            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(string.Format(SRServiceModel.MessageTextEncodingNotSupported, charSet), "encoding"));
        }
 
        public static string EncodingToCharSet(Encoding encoding)
        {
            string webName = encoding.WebName;
            CharSetEncoding[] charSetEncodings = CharSetEncodings;
            for (int i = 0; i < charSetEncodings.Length; i++)
            {
                Encoding enc = charSetEncodings[i].Encoding;
                if (enc == null)
                    continue;
 
                if (enc.WebName == webName)
                    return charSetEncodings[i].CharSet;
            }
            return null;
        }
 
        public static bool TryGetEncoding(string charSet, out Encoding encoding)
        {
            CharSetEncoding[] charSetEncodings = CharSetEncodings;
 
            // Quick check for exact equality
            for (int i = 0; i < charSetEncodings.Length; i++)
            {
                if (charSetEncodings[i].CharSet == charSet)
                {
                    encoding = charSetEncodings[i].Encoding;
                    return true;
                }
            }
 
            // Check for case insensitive match
            for (int i = 0; i < charSetEncodings.Length; i++)
            {
                string compare = charSetEncodings[i].CharSet;
                if (compare == null)
                    continue;
 
                if (compare.Equals(charSet, StringComparison.OrdinalIgnoreCase))
                {
                    encoding = charSetEncodings[i].Encoding;
                    return true;
                }
            }
 
            encoding = null;
            return false;
        }
 
        public class CharSetEncoding
        {
            public string CharSet;
            public Encoding Encoding;
 
            public CharSetEncoding(string charSet, Encoding enc)
            {
                CharSet = charSet;
                Encoding = enc;
            }
        }
    }
 
    public static class MtomEncoderDefaults
    {
        internal const int MaxBufferSize = 65536;
    }
 
    public static class BinaryEncoderDefaults
    {
        public static EnvelopeVersion EnvelopeVersion { get { return EnvelopeVersion.Soap12; } }
        public static BinaryVersion BinaryVersion { get { return BinaryVersion.Version1; } }
        public const int MaxSessionSize = 2048;
    }
 
    public static class TransportDefaults
    {
        public const bool ExtractGroupsForWindowsAccounts = SspiSecurityTokenProvider.DefaultExtractWindowsGroupClaims;
        public const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact;
        public const TokenImpersonationLevel ImpersonationLevel = TokenImpersonationLevel.Identification;
        public const bool ManualAddressing = false;
        public const long MaxReceivedMessageSize = 65536;
        public const int MaxDrainSize = (int)MaxReceivedMessageSize;
        public const long MaxBufferPoolSize = 512 * 1024;
        public const int MaxBufferSize = (int)MaxReceivedMessageSize;
        public const bool RequireClientCertificate = false;
        public const int MaxFaultSize = MaxBufferSize;
        public const int MaxSecurityFaultSize = 16384;
        public const SslProtocols SslProtocols =
                                           // SSL3 is not supported in CoreFx.
                                           System.Security.Authentication.SslProtocols.Tls |
                                           System.Security.Authentication.SslProtocols.Tls11 |
                                           System.Security.Authentication.SslProtocols.Tls12;
 
        // Calling CreateFault on an incoming message can expose some DoS-related security 
        // vulnerabilities when a service is in streaming mode.  See MB 47592 for more details. 
        // The RM protocol service does not use streaming mode on any of its bindings, so the
        // message we have in hand has already passed the binding’s MaxReceivedMessageSize check.
        // Custom transports can use RM so int.MaxValue is dangerous.
        public const int MaxRMFaultSize = (int)MaxReceivedMessageSize;
 
        public static MessageEncoderFactory GetDefaultMessageEncoderFactory()
        {
            return new BinaryMessageEncodingBindingElement().CreateMessageEncoderFactory();
        }
    }
 
    public static class ConnectionOrientedTransportDefaults
    {
        public const bool AllowNtlm = SspiSecurityTokenProvider.DefaultAllowNtlm;
        public const int ConnectionBufferSize = 8192;
        public const string ConnectionPoolGroupName = "default";
        public const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard;
        public static TimeSpan IdleTimeout { get { return TimeSpanHelper.FromMinutes(2, IdleTimeoutString); } }
        public const string IdleTimeoutString = "00:02:00";
        public static TimeSpan ChannelInitializationTimeout { get { return TimeSpanHelper.FromSeconds(30, ChannelInitializationTimeoutString); } }
        public const string ChannelInitializationTimeoutString = "00:00:30";
        public const int MaxContentTypeSize = 256;
        public const int MaxOutboundConnectionsPerEndpoint = 10;
        public const int MaxPendingConnectionsConst = 0;
        public static TimeSpan MaxOutputDelay { get { return TimeSpanHelper.FromMilliseconds(200, MaxOutputDelayString); } }
        public const string MaxOutputDelayString = "00:00:00.2";
        public const int MaxPendingAcceptsConst = 0;
        public const int MaxViaSize = 2048;
        public const ProtectionLevel ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
        public const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
 
        public static int GetMaxConnections()
        {
            return GetMaxPendingConnections();
        }
 
        public static int GetMaxPendingConnections()
        {
            return 12 * Environment.ProcessorCount;
        }
 
        public static int GetMaxPendingAccepts()
        {
            return 2 * Environment.ProcessorCount;
        }
    }
 
    public static class TcpTransportDefaults
    {
        public const int ListenBacklogConst = 0;
        public static TimeSpan ConnectionLeaseTimeout { get { return TimeSpanHelper.FromMinutes(5, TcpTransportDefaults.ConnectionLeaseTimeoutString); } }
        public const string ConnectionLeaseTimeoutString = "00:05:00";
        public const bool PortSharingEnabled = false;
        public const bool TeredoEnabled = false;
 
        private const int ListenBacklogPre45 = 10;
 
        public static int GetListenBacklog()
        {
            return 12 * Environment.ProcessorCount;
        }
    }
 
    public static class ApplicationContainerSettingsDefaults
    {
        public const string CurrentUserSessionDefaultString = "CurrentSession";
        public const string Session0ServiceSessionString = "ServiceSession";
        public const string PackageFullNameDefaultString = null;
 
        /// <summary>
        /// The current session will be used for resource lookup.
        /// </summary>
        public const int CurrentSession = -1;
 
        /// <summary>
        /// Session 0 is the NT Service session
        /// </summary>
        public const int ServiceSession = 0;
    }
 
    public static class HttpTransportDefaults
    {
        public const bool AllowCookies = false;
        public const AuthenticationSchemes AuthenticationScheme = AuthenticationSchemes.Anonymous;
        public const bool DecompressionEnabled = true;
        public const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard;
        public const bool KeepAliveEnabled = true;
        public const string Realm = "";
        public const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
        public const bool UnsafeConnectionNtlmAuthentication = false;
        public const bool UseDefaultWebProxy = true;
        public const string UpgradeHeader = "Upgrade";
        public const string ConnectionHeader = "Connection";
        public const HttpMessageHandlerFactory MessageHandlerFactory = null;
 
        public static TimeSpan RequestInitializationTimeout { get { return TimeSpanHelper.FromMilliseconds(0, RequestInitializationTimeoutString); } }
        public const string RequestInitializationTimeoutString = "00:00:00";
 
        // We use 0 as the default value of the MaxPendingAccepts property on HttpTransportBindingElement. In 4.5 we always
        // use 10 under the hood if the default value is picked. In future releases, we could adjust the underlying default
        // value when we have the dynamic expending pattern of BeginGetContext call implemented and the heap fragmentation issue
        // from NCL layer solved.
        private const int PendingAcceptsConstant = 10;
        public const int DefaultMaxPendingAccepts = 0;
        public const int MaxPendingAcceptsUpperLimit = 100000;
        public static int GetEffectiveMaxPendingAccepts(int maxPendingAccepts)
        {
            return maxPendingAccepts == HttpTransportDefaults.DefaultMaxPendingAccepts ?
                                        PendingAcceptsConstant :
                                        maxPendingAccepts;
        }
 
 
        public static WebSocketTransportSettings GetDefaultWebSocketTransportSettings()
        {
            return new WebSocketTransportSettings();
        }
 
        public static MessageEncoderFactory GetDefaultMessageEncoderFactory()
        {
            return new TextMessageEncoderFactory(MessageVersion.Default, TextEncoderDefaults.Encoding, EncoderDefaults.MaxReadPoolSize, EncoderDefaults.MaxWritePoolSize, EncoderDefaults.ReaderQuotas);
        }
    }
 
    public static class NetTcpDefaults
    {
        public const MessageCredentialType MessageSecurityClientCredentialType = MessageCredentialType.Windows;
        internal const bool TransactionsEnabled = false;
    }
 
    public static class OneWayDefaults
    {
        public static TimeSpan IdleTimeout { get { return TimeSpanHelper.FromMinutes(2, IdleTimeoutString); } }
        public const string IdleTimeoutString = "00:02:00";
        public const int MaxOutboundChannelsPerEndpoint = 10;
        public static TimeSpan LeaseTimeout { get { return TimeSpanHelper.FromMinutes(10, LeaseTimeoutString); } }
        public const string LeaseTimeoutString = "00:10:00";
        public const int MaxAcceptedChannels = 10;
        public const bool PacketRoutable = false;
    }
 
    internal static class ReliableSessionDefaults
    {
        internal const string AcknowledgementIntervalString = "00:00:00.2";
        internal static TimeSpan AcknowledgementInterval { get { return TimeSpanHelper.FromMilliseconds(200, AcknowledgementIntervalString); } }
        internal const bool Enabled = false;
        internal const bool FlowControlEnabled = true;
        internal const string InactivityTimeoutString = "00:10:00";
        internal static TimeSpan InactivityTimeout { get { return TimeSpanHelper.FromMinutes(10, InactivityTimeoutString); } }
        internal const int MaxPendingChannels = 4;
        internal const int MaxRetryCount = 8;
        internal const int MaxTransferWindowSize = 8;
        internal const bool Ordered = true;
        internal static ReliableMessagingVersion ReliableMessagingVersion { get { return System.ServiceModel.ReliableMessagingVersion.WSReliableMessagingFebruary2005; } }
        internal const string ReliableMessagingVersionString = "WSReliableMessagingFebruary2005";  // TODO: System.ServiceModel.Configuration.ConfigurationStrings.WSReliableMessagingFebruary2005;
    }
 
    public static class BasicHttpBindingDefaults
    {
        public const BasicHttpMessageCredentialType MessageSecurityClientCredentialType = BasicHttpMessageCredentialType.UserName;
        public const WSMessageEncoding MessageEncoding = WSMessageEncoding.Text;
        public const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
        public static Encoding TextEncoding
        {
            get { return TextEncoderDefaults.Encoding; }
        }
    }
 
    internal static class WSHttpBindingDefaults
    {
        internal const WSMessageEncoding MessageEncoding = WSMessageEncoding.Text;
    }
 
    public static class WebSocketDefaults
    {
        public const WebSocketTransportUsage TransportUsage = WebSocketTransportUsage.Never;
        public const bool CreateNotificationOnConnection = false;
        public const string DefaultKeepAliveIntervalString = "00:00:00";
        public static readonly TimeSpan DefaultKeepAliveInterval = TimeSpanHelper.FromSeconds(0, DefaultKeepAliveIntervalString);
 
        public const int BufferSize = 16 * 1024;
        public const int MinReceiveBufferSize = 256;
        public const int MinSendBufferSize = 16;
        internal const WebSocketMessageType DefaultWebSocketMessageType = WebSocketMessageType.Binary;
 
        public const string SubProtocol = null;
 
        public const string WebSocketConnectionHeaderValue = "Upgrade";
        public const string WebSocketUpgradeHeaderValue = "websocket";
    }
 
    public static class NetHttpBindingDefaults
    {
        public const NetHttpMessageEncoding MessageEncoding = NetHttpMessageEncoding.Binary;
        public const WebSocketTransportUsage TransportUsage = WebSocketTransportUsage.WhenDuplex;
    }
}