Hey,
Ik wil een text file van een webserver downloaden met HTTP GET, waarvoor ik momenteel deze code gebruik:
Dit werkt prima, het probleem is alleen dat dit bestand 2MB is en elke 5 seconden (ongeveer dan) gedownload gaat worden. Dat tikt toch flink aan kwa bandwidth lijkt me. Nou ja, als het goed is wordt er wel gzip gebruikt dus het zal geen 2MB zijn, maar dan nog.
Feit is dat ik nooit meer dan een bepaald aantal bytes van de file nodig heb, zeg de laatste 5000 bytes ofzo (dit is even een gok, maar het precieze aantal zal ik moeten uitzoeken). Volgens de host van de file zou de Range header van HTTP GET ondersteund zijn, waarmee ik een bepaalde range zou kunnen opvragen, dus zou ik alleen de laatste 5000 bytes kunnen opvragen.
Ik heb zitten zoeken hoe ik dit nu precies doe maar ik kan het nergens vinden. Ik begrijp dat ik de Range header moet opgeven, maar ik snap niet in welk formaat ik dit moet doen.
Ik heb de volgende headers geprobeerd toe te voegen (in de CreateWebClient methode):
(natuurlijk niet allemaal tegelijk, een voor een)
en vast nog wel meer... Ik kan nergens een voorbeeld vinden dat de range header gebruikt in C# dus ik ben gewoon maar wat gaan proberen. Ook de MSDN pagina voor WebClient lijkt nergens iets over ranges te zeggen.
Anyway, welke ik ook probeer, ik krijg gewoon elke keer de volledige file terug. Sommige regels leiden tot een error:
en sommige lijken gewoon niet te werken waarna ik gewoon weer de hele file terug krijg.
Voor zover ik kon vinden klopt de "-5000" wel, als het goed is is het format "start-eind", en door het weglaten van de start byte worden de laatste 5000 bytes opgehaald. Tenminste, dat heb ik hieruit kunnen opmaken.
Doe ik hier nu iets compleet fout? Ik weet vrijwel niets van HTTP GET, wat ik nu heb heb ik vooral uit voorbeeldjes in elkaar gepuzzeld dus ik kan me best voorstellen dat ik iets fundamenteels niet begrijp... Het zou mogelijk moeten zijn om de range header te gebruiken volgens de host, dus hoe kan ik dat implementeren in mijn code?
Bedankt!
Ik wil een text file van een webserver downloaden met HTTP GET, waarvoor ik momenteel deze code gebruik:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| public static string DownloadLog(string url) { var client = CreateWebClient(); var stream = client.OpenRead(url); if (stream == null) return string.Empty; using (var webReader = new StreamReader(stream)) { string data = string.Empty; // lees data uit en decompress met GZipStream... code weg gelaten return data; } } private static WebClient CreateWebClient() { System.Net.WebClient client; client = new System.Net.WebClient(); client.Headers["User-Agent"] = "Naam van m'n programma"; client.Headers["Accept-Encoding"] = "gzip"; return client; } |
Dit werkt prima, het probleem is alleen dat dit bestand 2MB is en elke 5 seconden (ongeveer dan) gedownload gaat worden. Dat tikt toch flink aan kwa bandwidth lijkt me. Nou ja, als het goed is wordt er wel gzip gebruikt dus het zal geen 2MB zijn, maar dan nog.
Feit is dat ik nooit meer dan een bepaald aantal bytes van de file nodig heb, zeg de laatste 5000 bytes ofzo (dit is even een gok, maar het precieze aantal zal ik moeten uitzoeken). Volgens de host van de file zou de Range header van HTTP GET ondersteund zijn, waarmee ik een bepaalde range zou kunnen opvragen, dus zou ik alleen de laatste 5000 bytes kunnen opvragen.
Ik heb zitten zoeken hoe ik dit nu precies doe maar ik kan het nergens vinden. Ik begrijp dat ik de Range header moet opgeven, maar ik snap niet in welk formaat ik dit moet doen.
Ik heb de volgende headers geprobeerd toe te voegen (in de CreateWebClient methode):
C#:
1
2
3
4
5
6
7
8
| client.Headers["Accept-Ranges"] = "-5000"; client.Headers["Accept-Ranges"] = "bytes: -5000"; client.Headers["Accept-Ranges"] = "bytes -500"; client.Headers["Range"] = "-5000"; client.Headers["Range"] = "bytes: -5000"; client.Headers["Range"] = "bytes -5000"; client.Headers["Range"] = "bytes=-5000"; client.Headers.Add("Range:bytes=-5000"); |
(natuurlijk niet allemaal tegelijk, een voor een)
en vast nog wel meer... Ik kan nergens een voorbeeld vinden dat de range header gebruikt in C# dus ik ben gewoon maar wat gaan proberen. Ook de MSDN pagina voor WebClient lijkt nergens iets over ranges te zeggen.
Anyway, welke ik ook probeer, ik krijg gewoon elke keer de volledige file terug. Sommige regels leiden tot een error:
code:
1
2
| This header must be modified using the appropriate property. Parameter name: name |
en sommige lijken gewoon niet te werken waarna ik gewoon weer de hele file terug krijg.
Voor zover ik kon vinden klopt de "-5000" wel, als het goed is is het format "start-eind", en door het weglaten van de start byte worden de laatste 5000 bytes opgehaald. Tenminste, dat heb ik hieruit kunnen opmaken.
Doe ik hier nu iets compleet fout? Ik weet vrijwel niets van HTTP GET, wat ik nu heb heb ik vooral uit voorbeeldjes in elkaar gepuzzeld dus ik kan me best voorstellen dat ik iets fundamenteels niet begrijp... Het zou mogelijk moeten zijn om de range header te gebruiken volgens de host, dus hoe kan ik dat implementeren in mijn code?
Bedankt!
[Voor 9% gewijzigd door NickThissen op 28-06-2011 18:43]