Лучший способ передачи файлов через веб-сервис - PullRequest
1 голос
/ 03 февраля 2011


Моя программа на C # обменивается данными с сервером через веб-службу, мне нужен клиент для загрузки больших файлов с сервера и возможность приостановить и продолжить их загрузку, загрузчик также должен быть авторизован для загрузки файла.

У меня было две мысли о том, как это сделать,

Один из них заключается в использовании стороннего API, такого как wget, для загрузки файлов. проблема в том, что мне нужно изучить команды API, и я не уверен, что смогу показать прогресс своей загрузки в программе; другая проблема заключается в том, что мне придется использовать пустые URL-адреса для получения файлов с сервера, который кажется уродливым и может привести к тому, что люди просто скачивают их с сервера (я хочу, чтобы они были авторизованы, хотя это не является реальной проблемой, поскольку это всего лишь школьный проект).

Моя другая мысль состояла в том, чтобы создать метод в веб-сервисе, который получит позицию в файле и количество байтов и вернет их, а клиент соберет их вместе, это кажется более сложным, но более убедительным, поскольку пользователь должен быть авторизованным для загрузки файла, и я могу использовать его, чтобы показать тестеру некоторые более продвинутые навыки программирования;). Похоже, проблема в том, что это может повлиять на производительность.
Каково твое мнение? Каков наилучший способ загрузки больших файлов с сервера?

1 Ответ

1 голос
/ 03 февраля 2011

При отсутствии необходимости авторизации и частичной загрузки, WebClient.DownloadData или WebClient.DownloadDataAsync будет предпочтительным способом загрузки файла с сервера.

Вы все еще можете использовать WebClient для авторизации, установив Credentials в вашем WebClient экземпляре объекта. Если пользователь не авторизован для загрузки файла на основе этих учетных данных, сервер может вернуть 404 (Не найдено) или 403 (Запрещено).

Если ваш сервер поддерживает HTTP 1.1, клиент может начать с середины файла. Для этого вам нужно создать класс, который наследуется от WebClient и переопределить метод GetWebRequest. Затем этот метод установит заголовки для позиционного GET.

class MyWebClient : WebClient
{
    public int StartDownloadAt { get; set; }
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);

        req.AddRange(position_to_start);
    }
}

И в коде, который его использует:

MyWebClient client = new MyWebClient();
client.StartDownloadAt = 1024 * 2024; // start download 1 megabyte into file.
client.DownloadData(...);

Выше приведен только пример. Возможно, вы захотите сделать это более устойчивым, установив для свойства StartDownLoadAt значение 0, когда загрузка будет завершена (или прервана), и не выполняйте AddRange, если StartdownloadAt установлено на 0. Для полной поддержки диапазонов вам, вероятно, понадобятся свойства для начального и конечного диапазона и т. д.

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

Суть в том, что это возможно с небольшой работой, используя класс WebClient.

...