2012-06-26 2 views
22

У меня есть небольшое приложение, которое использует 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» или «очень маленьких строк» ​​- поэтому, если это не так, то должен быть последовательный отказ.

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

+0

Вы эта службы в IIS или оно организовано с помощью службы Windows или какого-либо другого приложения? –

+0

Вы пытались играть с настройками таймаута и цитаты в файле конфигурации? – eulerfx

+0

На самом деле, я предлагаю включить трассировку WCF (как описано здесь: http://msdn.microsoft.com/en-us/library/ms733025.aspx) и просмотреть сообщения, которые регистрируются при появлении этих ошибок. –

ответ

9

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

1) Попробуйте дросселировать ваши службы WCF, например: попытайтесь увеличить свои параллельные сеансы. Посмотрите WCF Throttling

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

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

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

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

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

+0

Ive сделал то, что вы предложили .. и ive пусть он работает около 15 минут .. Только один клиент сообщает о проблемах .. (То же самое время тайм-аута). Я позволю ему запустить некоторое время и посмотреть, будет ли его единственный клиент сообщать о проблемах сейчас. Если это так, то плохой атрибут его для его соединения. (ака .. его поздно) ... –

3

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

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

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

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

См. Performance Counters for ASP.NET on MSDN.

+0

Более 2 минут - максимальный запрос ASP.NET в очереди - 1 .. ASP.NET v4 Запросы в очереди равно 0 (сидит работает .NET 4) –

25

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

<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"> 
+1

Это работает. Простое и простое решение. Я установил это на клиенте и сервисе. Большое спасибо. – FrenkyB

Смежные вопросы