Что делает параметр метода HttpResponse.WriteFile bool readIntoMemory? - PullRequest
3 голосов
/ 17 августа 2010

Что делает параметр метода HttpResponse.WriteFile bool readIntoMemory?

Документация MSDN очень бесполезна в этом отношении, так как я столкнулся с этим методом и точно не знал, почемуЯ хотел бы сделать это или не делать этого.

Примечание: если кто-нибудь ответит "хорошо, что он читает файл в память" без дальнейших объяснений, будет понижен.

Ответы [ 3 ]

6 голосов
/ 17 августа 2010

Расс прав насчет поведения - причина, по которой вы бы его использовали, состоит в том, чтобы не оставлять файл открытым / заблокированным - тем более что клиент может работать медленно или по истечении времени ожидания, может быть более предпочтительным сделать компромисс между памятью и буферомфайл в память, так что этот bool позволяет вам пропустить необходимость ReadAllBytes в буфер самостоятельно, а затем записать полученный буфер.

4 голосов
/ 17 августа 2010

Разница - это время чтения содержимого файла.

Если вы передаете true для readIntoMemory, поток файлов открывается, считывается в память и закрывается, и все это происходит во время WriteFile. С другой стороны, если вы передадите false, поток файлов откроется и снова закроется без чтения (просто чтобы убедиться, что файл существует). Вместо этого информация о том, какой файл записать, передается в некоторый внутренний буфер (с использованием внутреннего метода HttpWriter.WriteFile). Позже (возможно, когда ответ сброшен, но я не проверил это), содержимое файла будет прочитано.

Рассмотрим следующий код:

protected void Page_Load(object sender, EventArgs e)
{
    Response.WriteFile(@"C:\myFile", false);
    System.IO.File.Move(@"C:\myFile", "C:\myFile2");
    Response.End();
}

Обратите внимание, что ваш браузер не получит ответ, т. Е. Во время Response.End что-то идет ужасно плохо. Установка readIntoMemory на true позволяет избежать этой проблемы.

2 голосов
/ 17 августа 2010

Глядя на Reflector, кажется, что он указывает, следует ли буферизовать файл в памяти перед записью в ответ.

Файл открывается с использованием FileStream, а затем, если установлен этот логический флаг, он сначала считывает файл в байтовый массив, а затем записывает этот массив в ответ, используя WriteBytes.

Если флаг не установлен, файл записывается в ответ с помощью WriteFile.

В обоих предыдущих сценариях предполагается, что используется HttpWriter. Если это не так, тогда используется WriteStreamAsText.

...