Почему мои WCF обслуживают возврат FaultException, испытывают таймаут после 10 вызовов?

В моей программе Wallch ( http://sourceforge.net/projects/wall-changer/ ) я добавил новый класс форм qt designer.

Это работает просто отлично!

(я назвал название своего приложения, так что если вы хотите проверить проект, а не потому, что это мое приложение)

8
задан Jesper Kihlberg 12 June 2009 в 12:32
поделиться

6 ответов

Очевидно, код клиента должен быть следующим:

protected void RunTestGetData()
{
    TestServiceReference.Service1Client client
        = new WSPerformanceTester.TestServiceReference.Service1Client()
    try
    {
        client.GetData(1);
    }
    catch (FaultException e)
    {
        //Handle fault
    }
    try
    {
        if (client.State != System.ServiceModel.CommunicationState.Faulted)
        {
            client.Close();
        }
    }
    catch(Exception e)
    {
        outputWriter.WriteLine("Error occured in Client.Close()");
        outputWriter.Flush();
        client.Abort();
    }
}

Вызов client.Abort () всегда должен быть последним средством.

1
ответ дан 5 December 2019 в 19:02
поделиться

Я думаю, это может быть связано с тем, что стандартное поведение службы WCF - 10 одновременных сеансов. Сохраняете ли вы соединения открытыми после возникновения FaultExceptions? Вы можете попробовать изменить это значение в BehaviorConfiguration (ServiceThrottling> MaxConcurrentSessions) и посмотреть, изменится ли что-нибудь. Я предлагаю вам использовать редактор конфигурации службы Microsof, чтобы проверить, какие другие значения установлены по умолчанию. ( MSDN )

надеюсь, что это поможет ...

2
ответ дан 5 December 2019 в 19:02
поделиться

Я могу ошибаться здесь, но я думаю, что это как-то связано с хостингом службы WCF.

Потому что это может не быть иметь возможность отвечать на запросы своевременно.

IIS в Windows XP, например, может отвечать на 5 (и я не уверен в этом сейчас) одновременных запросов. Если сделано больше запросов, он попадает в очередь.

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

1
ответ дан 5 December 2019 в 19:02
поделиться

У меня недостаточно очков для комментариев, поэтому новый ответ ...

Самостоятельные службы допускают не более 10 одновременных подключений - независимо от транспорта. Если вы используете службы WCF внутри IIS / WAS, вам не следует об этом беспокоиться (если только вы не используете XP / Vista, где максимальное количество одновременных подключений также равно 10).

Различия между исключением сбоя и обычное исключение в этом сценарии может объяснить результат, который вы видите.

Помните, что обычное необработанное исключение приведет к отказу канала. При этом я предполагаю, что это открывает доступное соединение. Когда вы возвращаете ошибку, это автоматически приводит к ошибке канала, потому что это позволяет вам что-то делать с соединением и обрабатывать ошибку на вашей стороне, потому что это возможно «ожидаемое» ошибка, тогда как необработанное исключение не будет.

Даже когда вы возвращаете ошибку, вам все равно необходимо прервать () соединение. Кроме того, под ним находятся неуправляемые ресурсы, поэтому обязательно реализуйте IDisposable на вызывающих клиентах / прокси-серверах.

3
ответ дан 5 December 2019 в 19:02
поделиться

Попробуйте мой API-интерфейс клиента модели службы WCF и посмотрите, появятся ли те же результаты. Я думаю, что что-то не так в клиентском коде ...

Код

PPT

Кроме того, включите подробное ведение журнала WCF как на клиенте, так и на сервере ...

0
ответ дан 5 December 2019 в 19:02
поделиться

Я столкнулся с той же проблемой. При более внимательном рассмотрении выяснилось, что я не закрывал клиент веб-службы после того, как сделал вызовы веб-службы. Как только я это сделал, он не отказал даже после 10 вызовов методов веб-службы. См. Пример ниже.

WebServiceClient svcClient = new WebServiceClient();

string returnValue = svcClient.GetDocumentName(fileId);

svcClient.Close();

правильный шаблон:

using(WebServiceClient svcClient = new WebServiceClient())
{
   return svcClient.GetDocumentName(fileId);
}

ClientBase реализует IDisposable , который вызывает Close () в методе Dispose .

2
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: