Пауза/возобновление загрузки в C#

Я ищу способ приостановить или возобновить процесс загрузки через C# WebClient.

псевдокод:

WebClient Client = new WebClient();
Client.UploadFileAsync(new Uri("http://mysite.com/receiver.php"), "POST", "C:\MyFile.jpg");

Может что-то вроде..

Client.Pause();

любая идея?


person Community    schedule 26.06.2009    source источник
comment
Согласен с Джоном! На самом деле я открыл этот вопрос, потому что мне было любопытно посмотреть, как уживаются C # и PHP;)   -  person Hemant    schedule 26.06.2009


Ответы (4)


WebClient не имеет такой функциональности - даже HttpWebRequest немного более низкого уровня, насколько я знаю. Вам нужно будет использовать HTTP-библиотеку, которая дает вам больше контроля над точно, когда что-то происходит (что, несомненно, потребует больше кода, конечно). Смысл WebClient в том, чтобы предоставить очень простой API для использования в очень простых ситуациях.

person Jon Skeet    schedule 26.06.2009

Как заявил Джон Скит, это недоступно в классах Webclient, а не HttpWebRequest.

Однако, если у вас есть контроль над сервером, он получает загрузку; возможно, вы могли бы загрузить небольшие фрагменты файла с помощью WebClient и заставить сервер собрать фрагменты, когда все будет получено. Тогда вам будет несколько проще сделать паузу/возобновление.

Если у вас нет контроля над сервером, вам нужно будет использовать API, который дает вам простой контроль, а впоследствии дает вам больше поводов для беспокойства. И даже тогда сервер может дать вам тайм-аут, если вы сделаете паузу слишком долго.

person driis    schedule 26.06.2009

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

Напишите службу WCF для загрузки, эта служба должна использовать потоковую передачу.

то, что нужно запомнить:

  • клиент и сервер должны идентифицировать файл каким-то образом, я предлагаю использовать Guid, чтобы сервер знал, в какой файл также добавлять дополнительные данные.
  • Клиенту необходимо отслеживать позицию в массиве, чтобы он знал, с чего начать потоковую передачу после ее возобновления. (вы даже можете заставить сервер сообщить клиенту, сколько у него данных, но убедитесь, что клиент тоже знает).
  • Сервер должен отслеживать, сколько данных он уже скачал, а сколько еще не хватает. файлы должны иметь срок жизни на сервере, вы не хотите, чтобы загруженные наполовину и забытые файлы хранились на сервере навсегда.
  • помните, что потоковая передача не позволяет аутентифицироваться, поскольку весь вызов — это всего лишь один http-запрос. вы можете использовать ssl, но помните, что это добавит накладные расходы.
  • вам нужно будет создать сервисный контракт на уровне сообщений. Стандартный метод не подойдет.

В настоящее время я пишу сообщение в блоге на эту тему. На этой неделе оно будет опубликовано с примерами кода о том, как заставить его работать.

вы можете проверить это в мой блог

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

person dmportella    schedule 21.09.2009

Чтобы сделать что-то подобное, вы должны написать свой собственный рабочий поток, который поэтапно выполняет реальную публикацию http.

Перед отправкой вы должны проверить, не приостановлена ​​ли операция, и остановить отправку содержимого файла, пока она не будет возобновлена.

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

person devdimi    schedule 26.06.2009