2013-05-21 3 views
0

У меня есть веб-сайт ASP.Net, который получает всю бизнес-логику с сайта хостинга WCF (IIS). Время от времени это выглядит как замороженный WCF, который заставляет веб-интерфейс останавливаться. Мне нужно переработать оба пула приложений, чтобы они снова работали.WCF перестает отвечать на запросы

  • Это происходит чаще всего в последнее время, может быть, потому что у нас есть больше & клиентов с использованием сайта. Раньше это случается раз в месяц, теперь это происходит раз в неделю. Может больше.
  • Мы закрываем соединение после каждого вызова SVC.
  • Сообщение об ошибке получил в журнале событий после того, как я перерабатывают у бассейна

Сообщение: System.ServiceModel.CommunicationException: Произошла ошибка при получении ответа HTTP для ........... /.....BusinessServices.svc. Это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP. Это также может быть связано с тем, что сервер HTTP-запроса прерывается, и, возможно, из-за отключения службы. Подробнее см. Журналы сервера. ---> System.Net.WebException: базовое соединение было закрыто: произошла непредвиденная ошибка при получении. ---> System.IO.IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. ---> System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом

  • Web.config веб-приложения:
<bindings> 
<wsHttpBinding> 
<binding name="WSHttpBinding_IBusinessServices" closeTimeout="00:31:00" openTimeout="00:31:00" 
receiveTimeout="00:10:00" sendTimeout="00:31:00" 
bypassProxyOnLocal="false" transactionFlow="false" 
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" 
maxReceivedMessageSize="2147483647" messageEncoding="Text" 
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
    <readerQuotas maxDepth="999" maxStringContentLength="2147483647" maxArrayLength="1638400" 
    maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
    </binding> 
     </wsHttpBinding> 
     </bindings> 
    <client> 
    <endpoint address="http://localhost:8890/MyBusinessServices.svc" binding="wsHttpBinding" 
bindingConfiguration="WSHttpBinding_IBusinessServices" 
contract="MyBusinessServices.IBusinessServices" 
name="WSHttpBinding_IBusinessServices" /> 
</client> 
  • Web.config службы WCF с дросселированием, установленным на 1500

    .....

    <behavior name="AppServiceBehaviors"> 
         <serviceMetadata httpGetEnabled="true" /> 
         <serviceDebug includeExceptionDetailInFaults="true" /> 
         <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
         <serviceTimeouts transactionTimeout="00:15:00" /> 
         <serviceThrottling maxConcurrentCalls="1500" maxConcurrentSessions="1500" 
         maxConcurrentInstances="2147483647" /> 
        </behavior> 
    
        <behavior name=""> 
         <serviceMetadata httpGetEnabled="true" /> 
         <serviceDebug includeExceptionDetailInFaults="true" /> 
         <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
        </behavior> 
        </serviceBehaviors> 
    </behaviors> 
    

Эта проблема прерывистая, но это сводит меня с ума. Любые идеи/предложения приветствуются.

Эрик

ответ

0

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

Исключенное исключение - это своего рода общее исключение, которое может указывать на многие возможные сценарии. Например, если у вас есть балансировщик нагрузки перед серверами обслуживания, и один из них имеет ошибку во время выполнения, а другой - нет. Другим примером является то, что сервер sql создает исключение на стороне сервера, но ваши исключения для переноса могут не отправлять связанную информацию вашему клиенту.Поэтому вы не можете точно знать, что происходит.

У меня есть несколько предложений для Вас, чтобы проверить:

Я могу видеть, что вы выразили, что вы закрываете соединение после каждого вызова. Но вам нужно убедиться, что вызовы, получающие исключение, также закрыты. Так что ваш SVC вызовы должны выглядеть следующим образом:

try 
    { 
    if (this.client != null) 
    { 
     IClientChannel channel = this.client as IClientChannel; 
     if (channel.State == CommunicationState.Faulted) 
     { 
      channel.Abort(); 
     } 
     else 
     { 
      channel.Close(); 
     } 
    } 
    } 
    finally 
    { 
    this.client = null; 
    } 

Кроме этого, вы можете также проверить настройки пула приложений на IIS. В журналах событий вы можете убедиться, что вы не вынуждены перерабатывать/завершать работу с настройкой Maximum Failures. (В расширенных настройках пула приложений - rapidFailProtectionMaxCrashes)

0

Мои 2 цента за вас,

служба Прервать - ошибка из-за фатальной ошибки произошли внутри,

Убедитесь при отладке WCF в VS IDE в Dev, держать Исключения (Ctrl D, E), проверьте все столбцы «необработанные исключения». Это позволяет IDE разрывать линию кода приложения точно, в отличие от CATCHes .. это будет раскопать любые ошибки.

Пожалуйста, дайте нам знать, если какие-либо выводы здесь ...

Good Luck, HydTechie

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