Я делаю тесты с 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
Приветствие.