Ответ 1
Вы можете осуществлять загрузку с веб-сервера в C#
с нуля одним из двух способов:
-
Использование высокоуровневых API в System.Net, таких как
HttpWebRequest
,HttpWebResponse
,FtpWebRequest
и другие классы. -
Использование низкоуровневых API в System.Net.Sockets, таких как
TcpClient
,TcpListener
и классы Socket.
Преимущество использования первого подхода состоит в том, что вам, как правило, не нужно беспокоиться о низкоуровневой сантехнике, такой как подготовка и интерпретация заголовков HTTP и обработка прокси, аутентификация, кэширование и т.д. Классы высокого уровня делают это для вы и, следовательно, предпочитаете этот подход.
Используя первый метод, типичный код для подготовки HTTP-запроса для загрузки файла с URL-адреса будет выглядеть примерно так:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (UseProxy)
{
request.Proxy = new WebProxy(ProxyServer + ":" + ProxyPort.ToString());
if (ProxyUsername.Length > 0)
request.Proxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
}
//HttpWebRequest hrequest = (HttpWebRequest)request;
//hrequest.AddRange(BytesRead); ::TODO: Work on this
if (BytesRead > 0) request.AddRange(BytesRead);
WebResponse response = request.GetResponse();
//result.MimeType = res.ContentType;
//result.LastModified = response.LastModified;
if (!resuming)//(Size == 0)
{
//resuming = false;
Size = (int)response.ContentLength;
SizeInKB = (int)Size / 1024;
}
acceptRanges = String.Compare(response.Headers["Accept-Ranges"], "bytes", true) == 0;
//create network stream
ns = response.GetResponseStream();
В конце приведенного выше кода вы получаете объект сетевого потока, который затем можно использовать для чтения байтов удаленного файла, как если бы вы читали какой-либо другой объект потока. Теперь, поддерживает ли удаленный url возобновление частичных загрузок, позволяя вам читать любую произвольную позицию, определяется заголовком HTTP "Accept-Ranges" , как показано выше. Если для этого значения установлено значение, отличное от "байтов", эта функция не будет поддерживаться.
Фактически, этот код является частью более крупного диспетчера загрузки с открытым исходным кодом, который я пытаюсь реализовать на С#. Вы можете обратиться к этому приложению и посмотреть, поможет ли вам что-нибудь: http://scavenger.codeplex.com/