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

В ожидании ответа запрошен канал

У меня есть небольшое приложение, которое использует WCF для связи с веб-сервером. Эта программа используется примерно 200 клиентами, и каждый клиент отправляет около 5-20 запросов/мин.

Глядя на журналы ошибок, я часто получаю:

Отправленный запрос в ожидании ответа после 00: 00: 59,9989999

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

ClientService Client = new ClientService();
Client.Open();
Client.updateOnline(userID);
Client.Close();

Это app.config

<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="PATH TO SERVICE"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService"
            contract="IClientService" name="WSHttpBinding_IClientService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Из "многих звонков" каждый день около 200-800 терпят неудачу. И о n-1 в порядке. Я очень смущен тем, что может быть проблемой. Глядя на статистику сервера, он вряд ли наращивает пот - каждый запрос занимает менее 2 секунд для обработки. Передаваемые данные состоят из "int" или "очень маленьких строк" ​​- так что это не связано с размером, если это было - должен быть последовательный сбой.

Предложения?

4b9b3361

Ответ 1

Кажется, что ваши запросы находятся в очереди на сервере, прежде чем обрабатываться, а затем начинают тайм-аут. Вы можете попробовать пару вещей, чтобы посмотреть, что именно происходит.

1) Попробуйте дросселировать в своих службах WCF, например: Попробуйте увеличить количество одновременных сеансов. Взглянуть дросселирование WCF

2) Попробуйте использовать PerCall вместо использования сеансов здесь, чтобы убедиться, что сеанс не существует.  Вот что вы можете сделать на своем интерфейсе для удаления сеанса

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)]

и ваши классы контрактов, реализующие этот интерфейс

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

И.... Вы должны включить отслеживание, чтобы точно увидеть, что происходит.

Ответ 2

Попробуйте добавить значения тайм-аута как для службы, так и для клиента:

<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00"
    sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
    maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

Ответ 3

Проверьте этот счетчик производительности - ASP.NET Requests Queued.

В одном веб-приложении может размещаться множество веб-страниц и служб. По умолчанию IIS обрабатывает только 12 параллельных запросов на ядро ​​процессора.

Это означает, что даже если ваша служба работает быстро, а другие страницы/службы медленны, ваш запрос должен ждать в очереди до их выполнения.

ASP.NET Requests Queued должен быть равен нулю или близко к нулю.

См. Счетчики производительности для ASP.NET на MSDN.