ProcessorCount в WCF Throttling по умолчанию: Environment.ProcessorCount или количество процессоров?

У меня есть служба WCF, разработанная с помощью .NET 4.0. В поведении у меня есть этот элемент регулирования:

<behavior name="Test">
  <serviceThrottling maxConcurrentInstances="1000"/>
</behavior>

Насколько мне известно из этого: WCF 4: настройки регулирования по умолчанию для служб WCF

MaxConcurrentSessions: по умолчанию 100 * ProcessorCount MaxConcurrentCalls: по умолчанию 16 * ProcessorCount

На моем ПК у меня есть Environment.ProcessorCount = 2

Затем я добавил код, который считывает конфигурацию этих двух значений, поскольку я не добавлял значения явно, я ожидаю, что они будут по умолчанию.

Как я проверяю это из Global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    var config = WebConfigurationManager.OpenWebConfiguration("/TestDefaults");

    var bindings = BindingsSection.GetSection(config);
    var group = ServiceModelSectionGroup.GetSectionGroup(config);

    foreach (ServiceBehaviorElement behavior in group.Behaviors.ServiceBehaviors)
    {
        if (behavior.Name == "Test")
        {
            var th = ((ServiceThrottlingElement)behavior.Where(el => el is ServiceThrottlingElement).FirstOrDefault());

            if (th != null)
            {
                File.AppendAllText(Server.MapPath("~/Result.txt"), 
                    String.Format("MaxConcurrentCalls {0} MaxConcurrentSessions {1}",
                    th.MaxConcurrentCalls,
                    th.MaxConcurrentSessions));
            }
        }
    }
}

Результат:

MaxConcurrentCalls 16 MaxConcurrentSessions 100

Теперь я немного запутался, что такое значения по умолчанию? Может быть, эта проверка неверна? Заранее спасибо.


person Alexey Klipilin    schedule 02.03.2018    source источник


Ответы (1)


Судя по исходному коду .NET 4.7.1, значения, которые вы видели, верны. Это связано с тем, что вы читаете свойства конфигурации из конфигурации, а не свойства, установленные в экземпляре ServiceThrottle.

Если вы посмотрите на код для ServiceThrottlingElement вы увидите следующие свойства:

[ConfigurationProperty(ConfigurationStrings.MaxConcurrentCalls, DefaultValue = ServiceThrottle.DefaultMaxConcurrentCalls)]
[IntegerValidator(MinValue = 1)]
public int MaxConcurrentCalls
{
    get { return (int)base[ConfigurationStrings.MaxConcurrentCalls]; }
    set { base[ConfigurationStrings.MaxConcurrentCalls] = value; }
}

[ConfigurationProperty(ConfigurationStrings.MaxConcurrentSessions, DefaultValue = ServiceThrottle.DefaultMaxConcurrentSessions)]
[IntegerValidator(MinValue = 1)]
public int MaxConcurrentSessions
{
    get { return (int)base[ConfigurationStrings.MaxConcurrentSessions]; }
    set { base[ConfigurationStrings.MaxConcurrentSessions] = value; }
}

Обратите внимание, что по умолчанию для MaxConcurrentCalls установлено значение ServiceThrottle.DefaultMaxConcurrentCalls, а для MaxConcurrentSession установлено значение ServiceThrottle.DefaultMaxConcurrentSessions.

Эти значения определены в ServiceThrottle как :

internal const int DefaultMaxConcurrentCalls = 16;
internal const int DefaultMaxConcurrentSessions = 100;

Поскольку в файле конфигурации не было задано значений, вы получаете значения по умолчанию 16 и 100.

Однако если вы посмотрите на конструктор для ServiceThrottle, вы увидите следующее:

internal ServiceThrottle(ServiceHostBase host)
{
    if (!((host != null)))
    {
        Fx.Assert("ServiceThrottle.ServiceThrottle: (host != null)");
        throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("host");
    }
    this.host = host;
    this.MaxConcurrentCalls = ServiceThrottle.DefaultMaxConcurrentCallsCpuCount;
    this.MaxConcurrentSessions = ServiceThrottle.DefaultMaxConcurrentSessionsCpuCount;
    this.isActive = true;
}

DefaultMaxConcurrentCallsCpuCount и DefaultMaxConcurrentSessionsCpuCount определяются следующим образом:

internal static int DefaultMaxConcurrentCallsCpuCount = DefaultMaxConcurrentCalls * OSEnvironmentHelper.ProcessorCount;
internal static int DefaultMaxConcurrentSessionsCpuCount = DefaultMaxConcurrentSessions * OSEnvironmentHelper.ProcessorCount;

Таким образом, когда создается новый экземпляр, значения по умолчанию действительно равны 100 * количество процессоров и 16 * количество процессоров.

person Tim    schedule 02.03.2018