Http server

giovedì 12 maggio 2005 - 16.38

Dokkis Profilo | Newbie

ciao a tutti.. sto cercando di fare una mezza specie di piccolo web server.. col mio WS finchè devo scaricare file piccoli non ci sono problemi:

FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read,
FileShare.Read);
BinaryReader reader = new BinaryReader(fs);
byte[] bytes = new byte[fs.Length];
int read;
while((read = reader.Read(bytes, 0, bytes.Length)) != 0)
{
// Read from the file and write the data to the network
sResponse = sResponse + Encoding.ASCII.GetString(bytes,0,read);

iTotBytes = iTotBytes + read;

}
reader.Close();
fs.Close();
SendHeader(sHttpVersion, sMimeType, iTotBytes, " 200 OK", ref mySocket);
SendToBrowser(bytes, ref mySocket);

come potete assurdamente vedere il mio WS crea un array di byte[] grande quanto il conteggio totale dei byte del file.. quindi con file anche sugli 1-2 mb la ram skizza sui 50 mb e se provo con un file di 10 mb arriva anche a 100-200 mb di ram.. vorrei sapere come mandare i byte tipo con un buffer di 4096.. se mando semplicemente i byte a 4096 (so come fare) il metodo WebClient.Download(url,path) va in eccezione per protocollo errato.. prima di mandare i 4096 byte cosa dovrei mandare? in quel caso mando:

SendHeader(sHttpVersion, sMimeType, iTotBytes, " 200 OK", ref mySocket);
SendToBrowser(bytes, ref mySocket);
prima il msg 200 OK al client e poi tutti i byte del file.. se faccio così anche ad ogni 4096 il client mi scarica solo i primi 4096 byte dato che 200 OK si manda a protocollo finito.. come dovrei fare?? l'esempio l'ho trovato da qua:
http://www.codeproject.com/csharp/mywebserver.asp

Brainkiller Profilo | Guru

Ciao,
la costruzione di un server Web Http non è così semplice come qualcuno vorrebbe far credere. L'implementazione del protocollo già in sè non è una cosa molto banale.

In ogni caso ti sconsiglio l'uso della classe WebClient.Download perchè a me personalmente ha creato diversi problemi. In genere per questo tipo di applicazioni si usano i socket (classe Socket).

Riguardo al dump della memoria a 100 mega, sì, la risposta è che devi inviare i dati a chunk (blocchi) in modo da non creare un eccessivo overhead sul sistema.

Ultima considerazione per creare un Web Service scalabile ed efficente in termini di performance e memoria programmalo in Visual C++ che non sbagli.

ciao
david
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5