Как прервать поток из службы WCF, не читая его до конца?

Это проблема, которую я исследовал на прошлой неделе и не могу найти решения. Найденные сообщения спрашивают то же самое, но никогда не получают ответа, надеюсь, это поможет и другим.

У меня есть служба WCF, которая возвращает объект, содержащий внутри себя stream. Я использую basicHttpBindingс потоковой передачей и Mtom для отправки клиенту.

Клиент вызывает службу WCFи закрывает прокси сразу после получения объекта ответа.

Далее клиент читает поток, полученный от службы WCF, и записывает его в файл на локальном диске. Все это работает нормально.

Моя проблема заключается в том, что клиент хочет прервать операцию и прекратить загрузку данных из службы WCF. Если я вызову .close()в потоке, например:serverReply.DataStream.Close();затем он блокирует и читает весь поток из службы WCF до его конца, прежде чем продолжить. Поток может быть довольно большим и сеть не всегда быстрая.

Это очень нежелательно как для использования сетевых ресурсов, которые в основном тратятся на данные, которые больше не нужны. И поскольку basicHttpBindingразрешает только два одновременных TCP-подключения (по умолчанию )к серверу службы WCF,он блокирует другие попытки подключения, пока поток не будет прочитан до конца.

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

Например, 20 прерванных загрузок, которые все еще загружают данные, чтобы выбросить их. Мне нужно полностью остановить передачу.

На клиенте объект потока — это просто обычный класс Stream, поэтому он имеет только метод close и ничего больше.

Вызов .close()или .abort()для прокси-объекта не помогает, равно как и его уничтожение с помощью .dispose()или любого другого метода. На стороне сервера я обрабатываю событие OperationContext.OperationCompleted, но оно не срабатывает, пока данные из streamне будут прочитаны до конца.

Итак, вопрос в том, как закрыть/прервать поток, не читая его полностью?

17
задан BAdmin 8 March 2014 в 11:49
поделиться