2011-02-01 1 views
5

У меня есть несколько длительный процесс на основе WCF. Служба WCF работает в Azure, если есть какая-либо помощь. Проблема, которую я считаю, должен сделать тайм-аутов:Вопрос ожидания WCF?

1) Winforms клиент имеет следующие настройки .config в разделе связывания:

<wsHttpBinding> 
    <binding name="XXX" closeTimeout="00:05:00" openTimeout="00:05:00" 
    receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" 
    transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferPoolSize="10000000" maxReceivedMessageSize="10000000" 
    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
    allowCookies="false"> 
    <readerQuotas maxDepth="255" maxStringContentLength="8192" maxArrayLength="16384" 
    maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" 
    enabled="false" /> 
    <security mode="TransportWithMessageCredential"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
    <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="false"/> 
    </security> 
    </binding> 
</wsHttpBinding> 

2) WCF службы имеет следующий обязательный раздел в web.config

<wsHttpBinding> 
    <binding name="XXX" maxReceivedMessageSize="10000000" sendTimeout="00:10:00" receiveTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00"> 
    <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" establishSecurityContext="false" /> 
    </security> 
    <readerQuotas maxArrayLength="2000000" maxBytesPerRead="10000000" maxStringContentLength="10000000" maxDepth="255" /> 
    </binding> 

    </wsHttpBinding> 

3) У меня есть один длинный метод в WCF (обычно 2 минуты). Клиенты вызывают метод, а те, которые выполняются дольше, чем 1 минуту, выбрасываются с исключением. Это самое внутреннее исключение:

<InnerException> 
    <Type>System.Net.Sockets.SocketException</Type> 
    <Message>An existing connection was forcibly closed by the remote host</Message> 
    <StackTrace> 
     <Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame> 
    </StackTrace> 
    </InnerException> 
</InnerException> 

4) ФОС называют себя успешно завершена, однако (у меня есть и Start/End авторизовались на стороне сервера). Как избежать исключения?

Спасибо!

+0

В любое время она занимает около минуты, чтобы бежать, он возвращает эту ошибку. Ошибка возвращается клиенту точно через минуту. Однако сервер все еще выполняет вызов метода. – Igorek

ответ

8

Балансировщик нагрузки Windows Azure завершает свободные соединения через 60 секунд.

+1

Стив, ничего себе, полностью не знал этого ... есть ли способ продлить таймаут? Некоторые звонки могут занять более 1 минуты! – Igorek

+0

Интересно. Стив может ли каким-либо образом изменить это поведение или намерен ли работать с длительными работами с рабочей ролью с очередью или каким-либо другим методом перекрестных задач? –

+0

В настоящее время нет никакого способа изменить это. Однако, если вы можете периодически отправлять данные по TCP-соединению, он останется открытым. (Это только _idle_ соединения, которые заканчиваются.) – smarx