Подтвердить что ты не робот

Показатели WCF Max, по-видимому, ограничены 10

У меня есть простой сервис WCF, размещенный в IIS7.5, открытый через привязку wsHttp с использованием безопасности сообщений и InstanceContextMode.PerCall

У меня есть простой пользовательский интерфейс, который объединяет настраиваемое количество потоков, каждый из которых вызывает службу.

Я добавил счетчик perfmon ServiceModel4.Instances. Независимо от количества потоков, созданных и вызывающих службу, perfmon показывает, что служба создает максимум 10 экземпляров.

Моя конфигурация клиента выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <bindings>
    <wsHttpBinding>

      <binding name="WSHttpBinding_IService3">
        <security mode="Message">
          <transport clientCredentialType="Windows" proxyCredentialType="None"
            realm="" />
          <message clientCredentialType="Windows" negotiateServiceCredential="true"
            algorithmSuite="Default" establishSecurityContext="false" />
        </security>
      </binding>

    </wsHttpBinding>
  </bindings>
  <client>

    <endpoint address="http://localhost/NGCInstancing/Service3.svc/~/Service3.svc"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService3"
      contract="NGCSecPerCall.IService3" name="WSHttpBinding_IService3">
      <identity>
        <servicePrincipalName value="host/RB-T510" />
      </identity>
    </endpoint>

  </client>
</system.serviceModel>
</configuration>

Моя конфигурация сервиса выглядит следующим образом:

<?xml version="1.0"?>
<system.serviceModel>
    <configuration>
        <behaviors>
            <serviceBehaviors>
                <behavior name="SecPerCallBehaviour">
                    <serviceThrottling maxConcurrentCalls="30" maxConcurrentSessions="1000"
                    maxConcurrentInstances="30" />
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="BindingMessageSecPerCall" >
            <security mode="Message">
            <!-- it by setting establishSecurityContext to false that we enable per call instancing with security -->
            <message establishSecurityContext="false" />
            </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <services>
        <service name="ServiceInstancingDemo.Service3" behaviorConfiguration="SecPerCallBehaviour">
        <endpoint address="~/Service3.svc"
        binding="wsHttpBinding" bindingConfiguration="BindingMessageSecPerCall"
        contract="ServiceInstancingDemo.IService3" />
        </service>
    </services>
    </configuration>
</system.serviceModel>

Код клиента выглядит следующим образом:

private void btnSecPerCall_Click(object sender, EventArgs e)
    {
        int i;
        int requests;
        int delay;

        lblStatus.Text = "";

        DateTime startTime = DateTime.Now;
        this.listBox1.Items.Add("start time=" + DateTime.Now);

        delay = Convert.ToInt16(txtDelay.Text);
        requests = Convert.ToInt16(txtRequests.Text);

        Task<string>[] result;
        result = new Task<string>[requests];

        for (i = 0; i < requests; i++)
        {
            result[i] = Task<string>.Factory.StartNew(() => _ngcSecPerCall.WaitThenReturnString(delay));
        }

        for (i = 0; i < requests; i++)
        {
            this.listBox1.Items.Add(result[i].Result);
        }

        DateTime endTime = DateTime.Now;
        TimeSpan ts = endTime - startTime;
        lblStatus.Text = "Finished! Time taken= " + ts.Seconds + " seconds";

        this.listBox1.Items.Add("end time=" + DateTime.Now);
    }

Мой код обслуживания выглядит следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service3 : IService3
{
    private int m_counter;

    public string WaitThenReturnString(int waitMilliSeconds)
    {
        System.Threading.Thread.Sleep(waitMilliSeconds);
        int maxT, workCT;
        System.Threading.ThreadPool.GetMaxThreads(out maxT, out workCT);
        m_counter++;
        return String.Format("Incrementing counter to {0}.\r\nSession Id: {1}. Threads {2}, {3}", m_counter, OperationContext.Current.SessionId, maxT, workCT);
    }
}

Служба возвращает 400 400 для количества потоков.

Кто-нибудь знает, почему служба отказалась создавать более 10 экземпляров?

Если я создам копию службы, но с привязкой wsHttp, которая имеет <security mode="None"/>, тогда служба с радостью создала еще много экземпляров.

4b9b3361

Ответ 1

Вы тестируете на Windows Server или Windows 7? Причина, по которой я спрашиваю, заключается в том, что IIS в версиях клиентской ОС имеет 10 ограничений на соединение. Это делается для того, чтобы клиентская ОС не использовалась в серверной среде.

Ответ 2

Документация MaxConcurrentSessions упоминает оптимизацию для клиентских запросов, которые поступают из одного и того же AppDomain. Ваш пример кода в основном касается одного и того же сокета на службе. Поскольку на клиента выполняется некоторое регулирование, это может повлиять на поведение вашей службы. Кроме того, 10 является значением по умолчанию для MaxConcurrentSessions, поэтому может быть, что ваша конфигурация не меняет значение WCF по умолчанию.

Включение защиты влияет на общие потоки, потому что она устанавливает "сеанс" для каждого клиента, так что каждый отправленный запрос не должен быть аутентифицирован при каждом вызове. Эти сеансы безопасности учитываются в общей сумме MaxConcurrentSessions.

Ответ 3

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

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

http://www.codeproject.com/KB/webservices/quickwins.aspx

Возможно, клиент не генерирует более 10 запросов на один и тот же сервер. Итак, сначала попробуйте указанные выше конфигурации на обоих клиентах и ​​серверах.

И, конечно же, у вас должен быть Windows Server. В противном случае это будет ограничение IIS для Windows 7.