Я делаю тесты с ASP.NET HttpHandler для загрузки файла, непосредственно нападающего на поток ответов, и я не очень уверен в том, как я это делаю. Это примерный метод, в будущем файл может быть сохранен в BLOB в базе данных:
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
Но я не уверен, что это правильно или есть лучший способ сделать это. Мои вопросы:
- Когда я открываю URL-адрес в браузере, появляется диалоговое окно "Сохранить файл"... но похоже, что сервер уже начал вставлять данные в поток, прежде чем нажимать "Сохранить", это нормально?
- Если я удалю строку "response.Flush()", когда я открою URL-адрес браузера,... Я вижу, как веб-сервер нажимает данные, но диалог "Сохранить файл" не появляется, (или, по крайней мере, не в разумные сроки), почему?
- Когда я открываю url с объектом WebRequest, я вижу, что HttpResponse.ContentLength является "-1", хотя я могу читать поток и получать файл. В чем смысл -1? Когда HttpResponse.ContentLength будет показывать длину ответа? Например, у меня есть метод, который извлекает большой xml, сжатый с deflate как двоичный поток, но в этом случае... когда я обращаюсь к нему с помощью WebRequest, в HttpResponse я могу фактически увидеть ContentLength с длиной потока, почему?
- Какова оптимальная длина для массива Byte [], который я использую в качестве буфера для оптимальной производительности на веб-сервере? Я читал, что между 4K и 8K... но какие факторы я должен принять, чтобы принять правильное решение.
- Этот метод раздувает использование IIS или клиентской памяти? или это действительно правильно буферизует перенос?
Извините за столько вопросов, я довольно новичок в веб-разработке: P
Приветствия.