2013-04-29 23 views
18

Uygulamamdaki büyük bir dosyayı (~ 500MB) HTTP'den indirme nasıl yapılır? Otomatik özgeçmişi/tekrar denemeyi desteklemek istiyorum, böylece bağlantı kesildiğinde, uygulamam dosyayı almak için yeniden bağlanmayı deneyebilir ve mümkünse indirilen parçayı yeniden yüklemekten kaçınılır (Biliyorum, bu sunucuya da bağlıdır).NET'te özgeçmişi/yeniden deneme desteğiyle HTTP'den büyük dosya indirilsin mi?

Bu, indirme yöneticilerindeki ve bazı tarayıcılardaki davranışlara benzer.

+0

Bilmeniz gereken bir şey, bir yükleme işleminin devam edip edilemeyeceği veya sunucu tarafından belirlenip yüklenemeyeceğidir. –

+0

@RanhiruCooray Evet, bunun farkındayım. Sorum, sunucuya izin verdiğinde nasıl devam edeceğinizdir –

+0

Doğru aralığı kendiniz istemeniz gerekecektir. Yeni parlak 'Http.Client' bile bunu otomatik olarak yapmaz: http://blogs.msdn.com/b/webdev/archive/2012/11/23/asp-net-web-api-and-http-byte- range-support.aspx (Özel bir dosya indirme kütüphanesi bulamadıkça). – millimoose

cevap

-3

Bunu gerçekleştirebilmeniz için bir Internet Download Manager desteği var. Download IDMCOMAPI.zip, (Tlbimp) Type Library İçe Aktarıcı'yla birlikte, ayıklanan zip dosyasından IDManTypeInfo.tlb dosyasını içe aktarın.

komut:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\TlbExp.exe (FilePathGoesHere)\IDManTypeInfo.tlb 

not alın:

1.) Bir yönetici modunda Command Prompt çalışmalıdır.

2.) Özgeçmiş özelliği olmayan bazı dosyalar var. İki yoldan birini kullanarak sıfırdan C# bir web-sunucusundan indirme uygulayabilir

10

: System.Net'teki gibi HttpWebRequest, HttpWebResponse, FtpWebRequest üst düzey API'leri kullanarak

  1. ve diğer sınıflar. , TcpListener ve Soket sınıfları gibi System.Net.Sockets öğelerindeki düşük düzeyli API'ları kullanma.

birinci yaklaşımı kullanmanın avantajı, tipik böyle, önbelleğe alma vb üst düzey hazırlanması ve HTTP başlıklarını yorumlama ve vekiller, kimlik taşıma gibi düşük seviyeli sıhhi tesisat konusunda endişelenmenize gerek kalmamasıdır Sınıflar bunu sizin için yapar ve bu yüzden bu yaklaşımı tercih ederim. şuna benzer bir url bir dosya indirmek için bir HTTP isteği hazırlamak için ilk yöntem, tipik bir kodu kullanarak

: Yukarıdaki kod sonunda

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();   

, bir ağa olsun Daha sonra başka bir akış nesnesini okuyormuş gibi uzak dosyanın baytlarını okumak için kullanabileceğiniz akış nesnesi. Artık, uzak url, herhangi bir aritmetik pozisyondan okumanıza izin vererek kısmi yüklemelere devam etmeyi destekliyorsa, yukarıda gösterildiği gibi "Accept-Ranges" HTTP başlığı tarafından belirlenir. Bu değer "bayt" dışında bir değere ayarlanırsa, bu özellik desteklenmez. Aslında bu kod, C# 'da uygulamaya çalıştığım daha büyük bir açık kaynak indirme yöneticisinin parçasıdır. Bu uygulamaya başvurmak ve bir şey sizin için yararlı olabilir eğer görebilirsiniz: açık kaynak .Net http dosya indirici otomatik özgeçmiş ile vardır http://scavenger.codeplex.com/

3

(sunucu destekliyorsa)/destek yeniden denemek, bu tam olarak ne gerek var gibi görünüyor Kullanmayı deneyebilir:

https://github.com/Avira/.NetFileDownloader.

+1

Bağlantıları yanıt olarak göndermek yerine, bu sorunun cevabın OP'ye nasıl yardımcı olacağını açıklamak için bazı metinleri ekleyin.Teşekkürler –

+1

Teşekkürler, cevabımı biraz hatırladım. –

+0

@leonidp Orada iyi görünüyor, ancak bir DownloadCacheImplementation sınıfı eksik. Lütfen bana yardım edebilir misiniz? –