С# загрузить файл из Интернета

Есть ли способ заставить следующую функцию работать через прокси?

public T[] ReadStream(System.IO.TextReader reader);

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

А может есть что-то дефолтное для этого?


person Yippie-Ki-Yay    schedule 08.04.2011    source источник


Ответы (2)


Используйте WebClient.DownloadFile. Если вам нужен прокси, вы можете установить свойство Proxy вашего объекта WebClient.

Вот пример:

using (var client = new WebClient())
{
    client.Proxy = new WebProxy("some.proxy.com", 8000);
    client.DownloadFile("example.com/file.jpg", "file.jpg");
}

Вы также можете загрузить файл по частям с помощью BinaryReader:

using (var client = new WebClient())
{
    client.Proxy = new WebProxy("some.proxy.com", 8000);

    using (var reader = new BinaryReader(client.OpenRead("example.com/file.jpg")))
    {
        reader.ReadByte();
        reader.ReadInt32();
        reader.ReadBoolean();

        // etc.
    }
}
person Community    schedule 08.04.2011
comment
То, что вы предлагаете, является очевидным способом. Когда я говорил о proxy, я имел в виду некий объект, который будет последовательно кэшировать файл из Интернета и перенаправлять все read-подобные вызовы из соответствующего интерфейса в этот кэшированный фрагмент файла. Чтобы я мог сказать TextReader t = new MyCustomWebReader("http://www.site.com/file.zip"); и он это прочитал (с паузами, разумеется). - person Yippie-Ki-Yay; 09.04.2011
comment
Я не уверен, что понимаю, о чем вы просите. - person ; 09.04.2011
comment
Аналогично этому, где StreamReader создается поверх веб-запроса: stackoverflow.com/questions/4842038/ - person Yippie-Ki-Yay; 09.04.2011
comment
Я хочу того же для произвольных удаленных файлов. - person Yippie-Ki-Yay; 09.04.2011
comment
Не обязательно проксировать, просто оберните запрос в StreamReader, чтобы он загружал и читал файл последовательно. - person Yippie-Ki-Yay; 09.04.2011

Возможно, это то, что вы хотите? Меня также немного смущает формулировка вопроса, учитывая ваши комментарии к предыдущему ответу.

public StreamReader GetWebReader(string uri)
{
    var webRequest = WebRequest.Create(uri);
    var webResponse = webRequest.GetResponse();
    var responseStream = webResponse.GetResponseStream();
    return new StreamReader(responseStream);
}
person Ross Anderson    schedule 08.04.2011
comment
Хорошо, если бы это не был ответ, который я написал 15 минут назад :) - person Yippie-Ki-Yay; 09.04.2011