Я использую потоковую передачу WCF для передачи файла из клиента WCF в службу с помощью netTcpBinding
.
Как только клиент вызовет службу с помощью экземпляра Stream, служба начнет чтение из экземпляра Stream через соединение через сокет (StreamConnection
). Но, если в процедуре чтения из потока на стороне сервиса возникает исключение, клиентская сторона не может сразу получить исключение.
Я обнаружил период задержки, связанный с sendTimeout
привязки. Если я установлю sendTimeout=20 seconds
, клиент получит исключение с задержкой в 20 секунд; и если sendTimeout = 1 second
, клиент немедленно получает исключение.
Я провел небольшое исследование. Насколько я понимаю, даже когда исключение выдается службе, оно не будет выдано клиенту до истечения времени StreamConnection.Read()/StreamConnection.Write()
. Этот период ожидания выглядит синхронизированным с привязкой sendTimeout.
Можно ли сохранить sendTimeout
и позволить клиенту немедленно получить исключение?
Вот привязка службы, (Чтобы передать файл большого размера, я меняю значение maxReceivedMessageSize, sendTimeout и ReceiveTimeout и т. д.)
<netTcpBinding>
<binding name="StreamingNetTCPBinding" transferMode="Streamed" maxConnections="500" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" sendTimeout="00:45:00" receiveTimeout="23:00:00" listenBacklog="20">
<readerQuotas maxArrayLength="2147483647" maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647" />
</binding>
</netTcpBinding>