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