Это проблема, которую я исследовал на прошлой неделе и не могу найти решения. Найденные сообщения спрашивают то же самое, но никогда не получают ответа, надеюсь, это поможет и другим.
У меня есть служба WCF
, которая возвращает объект, содержащий внутри себя stream
. Я использую basicHttpBinding
с потоковой передачей и Mtom для отправки клиенту.
Клиент вызывает службу WCF
и закрывает прокси сразу после получения объекта ответа.
Далее клиент читает поток, полученный от службы WCF, и записывает его в файл на локальном диске. Все это работает нормально.
Моя проблема заключается в том, что клиент хочет прервать операцию и прекратить загрузку данных из службы WCF. Если я вызову .close()
в потоке, например:serverReply.DataStream.Close();
затем он блокирует и читает весь поток из службы WCF до его конца, прежде чем продолжить. Поток может быть довольно большим и сеть не всегда быстрая.
Это очень нежелательно как для использования сетевых ресурсов, которые в основном тратятся на данные, которые больше не нужны. И поскольку basicHttpBinding
разрешает только два одновременных TCP-подключения (по умолчанию )к серверу службы WCF,он блокирует другие попытки подключения, пока поток не будет прочитан до конца.
Я мог бы увеличить количество одновременных подключений, но это было бы плохим решением, так как создало бы возможность для неприятностей.
Например, 20 прерванных загрузок, которые все еще загружают данные, чтобы выбросить их. Мне нужно полностью остановить передачу.
На клиенте объект потока — это просто обычный класс Stream
, поэтому он имеет только метод close и ничего больше.
Вызов .close()
или .abort()
для прокси-объекта не помогает, равно как и его уничтожение с помощью .dispose()
или любого другого метода. На стороне сервера я обрабатываю событие OperationContext.OperationCompleted
, но оно не срабатывает, пока данные из stream
не будут прочитаны до конца.
Итак, вопрос в том, как закрыть/прервать поток, не читая его полностью?