WCF, странное игнорирование timeout-ов
От: Programmer75 Украина  
Дата: 21.10.15 00:10
Оценка:
Привет всем. Пару вечеров убил на элементарной настройке WCF клиент-сервера, надеюсь на помощь зала ...

При длительной (более 30 мин.) работе сервера, клиент получает ошибку timeot-а, хотя в конфиге было receiveTimeot="2:0:0" (прочие timeot-ы добавил в процессе поисков решения)! Откуда WCF берет эти "0:30:0" — не могу понять ((. Отладка с такими задержками занимает много времени, и я решил пойти другим путем : установил малые значения timeot-ов, но по их истечении клиент продолжает работать, а после тех же 30-ти мин. вылетает исключение ((.

Предоставляю кусок клиентской настройки :
    <appSettings>
        <!--    Список серверов -->
        <add key="EndPoints" value="tcp_local"/>
    </appSettings>

    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="TcpBindingStream" transferMode="Streamed" maxReceivedMessageSize="2147483647" receiveTimeout="0:2:0" sendTimeout="0:2:0" openTimeout="0:0:30" closeTimeout="0:0:10">
                    <security mode="None" />
                </binding>
            </netTcpBinding>
        </bindings>

        <behaviors>
            <endpointBehaviors>
                <behavior>
                    <callbackDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </endpointBehaviors>
        </behaviors>

        <client>
            <!-- <identity><certificateReference storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectDistinguishedName" /></identity> -->
            <endpoint binding="netTcpBinding" contract="Reports.Common.IReportsService" name="tcp_local" bindingConfiguration="TcpBindingStream" address="net.tcp://<ip>:<port>/Reports" />
            <endpoint binding="netTcpBinding" contract="Reports.Common.IReportsService" name="was_local" bindingConfiguration="TcpBindingStream" address="net.tcp://<ip>:<port>/Reports/Service1.svc" />
            <endpoint binding="basicHttpBinding" contract="Reports.Common.IReportsService" name="http_local" address="http://<ip>:<port>/Reports/Service1.svc" />


        </client>

    </system.serviceModel>


И кусок серверной :
        <bindings>
            <netTcpBinding>

                <binding name="TcpBindingStream" transferMode="Streamed" maxReceivedMessageSize="2147483647" sendTimeout="0:2:0" receiveTimeout="0:1:0">
                    <security mode="None" />
                </binding>

            </netTcpBinding>
        </bindings>

        <services>
            <service name="Reports.Svc.Service1">
                <endpoint address="net.tcp://0.0.0.0:<port>/Reports" binding="netTcpBinding" bindingConfiguration="TcpBindingStream" contract="Reports.Common.IReportsService"/>
            </service>
        </services>


На клиенте фабрика каналов создается так :
    var factory = new System.ServiceModel.ChannelFactory<TContract>(this.CurrentValue);

где
    this.CurrentValue = "tcp_local";


Сервис хостится на WinForm-приложении.

Заранее благодарен любым мыслям по этому поводу.

ЗЫ
Набросал тестовое приложение по всем канонам MSDN (т.е. импортировал сервис мастером, без общей библиотеки) с привязкой к basicHttpBinding — указанных недостатков не обнаружил ...
WCF timeout .NET c#
Re: WCF, странное игнорирование timeout-ов
От: Sinix  
Дата: 21.10.15 08:27
Оценка: 2 (1)
Здравствуйте, Programmer75, Вы писали:

P>Набросал тестовое приложение по всем канонам MSDN (т.е. импортировал сервис мастером, без общей библиотеки) с привязкой к basicHttpBinding — указанных недостатков не обнаружил ...


А что в тексте исключения? Wcf обычно пишет что-то типа "did not receive a reply within the configured timeout" с указанием таймаута.

Ну и классика — подключаемся отладчиком, останавливаемся в момент броска исключения и смотрим по locals, что пошло не так. Вот неплохая вводная статья.
Re: WCF, странное игнорирование timeout-ов
От: Sharov Россия  
Дата: 21.10.15 10:03
Оценка: 41 (2)
Здравствуйте, Programmer75, Вы писали:

Правило номер 0, которое я уже ни раз писал на этом форуме -- включите логи WCF, и настройте логгирование по максимуму. И будет Вам полная инф-ия об ошибке.

P>При длительной (более 30 мин.) работе сервера, клиент получает ошибку timeot-а, хотя в конфиге было receiveTimeot="2:0:0"


Вот неплохой тред на SO по receiveTimeot, и оттуда же еще одна хорошая ссылка.
Кодом людям нужно помогать!
Отредактировано 21.10.2015 11:31 Sharov . Предыдущая версия .
Re[2]: WCF, странное игнорирование timeout-ов
От: Sinix  
Дата: 21.10.15 10:31
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Вот неплохой тред на SO по receiveTimeot, и оттуда же еще одна хорошая ссылка.


А толку-то? У топикстартера 30 минут таймаут, все стандартные, насколько помню 1 и 10 минут. Такое впечатление, что таймаут где-то втихую переопределяется.
Re[3]: WCF, странное игнорирование timeout-ов
От: Sharov Россия  
Дата: 21.10.15 10:39
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>А толку-то? У топикстартера 30 минут таймаут, все стандартные, насколько помню 1 и 10 минут. Такое впечатление, что таймаут где-то втихую переопределяется.


Как я уже писал, ТС по уму надо логи врубить и все. Ждать падения. А приведенная информация больше для размышления и понимание что к чему.
Кодом людям нужно помогать!
Re[2]: WCF, странное игнорирование timeout-ов
От: Programmer75 Украина  
Дата: 22.10.15 08:52
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Правило номер 0, которое я уже ни раз писал на этом форуме -- включите логи WCF, и настройте логгирование по максимуму. И будет Вам полная инф-ия об ошибке.

Я не использую IIS. Сервис хостится на WinForm-приложении. Или я что-то недопонимаю о логировании WCF?

S>Вот неплохой тред на SO по receiveTimeot, и оттуда же еще одна хорошая ссылка.

За ссылки спасибо. Оказалось, что я неправильно для себя понимал назначения sendTimeout и receiveTimeout.
Re[2]: WCF, странное игнорирование timeout-ов
От: Programmer75 Украина  
Дата: 22.10.15 09:03
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А что в тексте исключения? Wcf обычно пишет что-то типа "did not receive a reply within the configured timeout" с указанием таймаута.


На клиенте receiveTimeout="0:2:0" sendTimeout="0:2:0" openTimeout="0:0:10" closeTimeout="0:0:10". На сервере стояла задержка данных 35 мин. Исключение на клиенте появилось спустя 30 мин. Его содержание :

System.TimeoutException: The request channel timed out while waiting for a reply after 00:30:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The socket transfer timed out after 00:30:00. You have exceeded the timeout set on your binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера


S>Ну и классика — подключаемся отладчиком, останавливаемся в момент броска исключения и смотрим по locals, что пошло не так. Вот неплохая вводная статья.

Почитаю, может поможет в чем-то ...
Re[3]: WCF, странное игнорирование timeout-ов
От: Sharov Россия  
Дата: 22.10.15 09:23
Оценка:
Здравствуйте, Programmer75, Вы писали:

S>>Правило номер 0, которое я уже ни раз писал на этом форуме -- включите логи WCF, и настройте логгирование по максимуму. И будет Вам полная инф-ия об ошибке.

P>Я не использую IIS. Сервис хостится на WinForm-приложении. Или я что-то недопонимаю о логировании WCF?

IIS вообще не причем, от слова совсем. Tracing and Message Logging и
Service Trace Viewer Tool. Логгер можно настроить в стандартной утилите svcconfigчегототам.exe

P>За ссылки спасибо. Оказалось, что я неправильно для себя понимал назначения sendTimeout и receiveTimeout.


Угу, тоже самое было. Поэтому и посчитал, что будет полезно ознакомиться.
Кодом людям нужно помогать!
Re: WCF, странное игнорирование timeout-ов
От: Programmer75 Украина  
Дата: 22.10.15 09:44
Оценка: :)
Здравствуйте, Programmer75, Вы писали:

P>Привет всем. Пару вечеров убил на элементарной настройке WCF клиент-сервера, надеюсь на помощь зала ...


P>При длительной (более 30 мин.) работе сервера, клиент получает ошибку timeot-а, хотя в конфиге было receiveTimeot="2:0:0" (прочие timeot-ы добавил в процессе поисков решения)! Откуда WCF берет эти "0:30:0" — не могу понять ((. Отладка с такими задержками занимает много времени, и я решил пойти другим путем : установил малые значения timeot-ов, но по их истечении клиент продолжает работать, а после тех же 30-ти мин. вылетает исключение ((.


P> ...


P>Сервис хостится на WinForm-приложении.


P>Заранее благодарен любым мыслям по этому поводу.


P>ЗЫ

P>Набросал тестовое приложение по всем канонам MSDN (т.е. импортировал сервис мастером, без общей библиотеки) с привязкой к basicHttpBinding — указанных недостатков не обнаружил ...


Проблема решена:
После создания фабрикой IContextChannel, ему в коде жестко присваивался OperationTimeout = 30 мин.

Всем спасибо. У Всех прошу прощения за отнятое время.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.