Ошибка WCF - система достигла предела, заданного для газа MaxConcurrentSessions - PullRequest
2 голосов
/ 20 января 2011

У меня есть приложение asp.net, которое вызывает службу WCF.У меня какое-то время были прерывистые тайм-ауты, поэтому я решил создать журнал трассировки.После получения тайм-аута я обнаружил следующее сообщение в файле журнала:

Система достигла предела, установленного для дросселя «MaxConcurrentSessions».Ограничение для этого газа было установлено равным 10. Значение газа можно изменить, изменив атрибут maxConcurrentSessions в элементе serviceThrottle или изменив свойство MaxConcurrentSessions в поведении ServiceThrottlingBehavior.

Дело в том, что язакрытие клиентского соединения каждый раз, поэтому я не понимаю, почему одновременные сеансы складываются.Ниже приведен типичный вызов, который я делаю:

    try
    {
        //create proxy
        client = new CAEServiceContractClient();

        response = client.GetSecurityRecords(item); 
        totalRecords = response.TotalRecords;

        securityListView.DataSource = response.SecurityItemColl; 
        securityListView.DataBind();

        // Always close the client.
        client.Close();
        success = true;
    }
    finally
    {
        if (!success)
        {
            client.Abort();
        }
    }

Итак, мой вопрос: почему сеанс не уничтожается, когда я выполняю client.Close ()?

TIA.

1 Ответ

1 голос
/ 20 января 2011

Я не вижу success, объявленного в приведенном выше коде как локальную переменную, и при этом я не вижу, что вы устанавливаете его в false. Может ли это быть членом класса, который устанавливается на true при первом успешном вызове и затем остается таким же?

В любом случае весь блок кода можно переписать, чтобы было проще понять (и меньше подвержен ошибкам), например:

using (var client = new CAEServiceContractClient())
{
    response = client.GetSecurityRecords(item); 
    totalRecords = response.TotalRecords;

    securityListView.DataSource = response.SecurityItemColl; 
    securityListView.DataBind();
}

Оператор using гарантирует, что после завершения блока using (обычно или ненормально из-за исключения) переменная client будет удалена (будет вызываться .Dispose()), закрывая тем самым соединение.

РЕДАКТИРОВАТЬ: Как отметил Ладислав Мрнка, метод .Dispose() ClientBase имеет плохую привычку вызывать исключение в некоторых случаях. Обязательно реализуйте метод .Dispose() в вашем частичном классе CAEServiceContractClient, как описано здесь .

...