Длина загружаемого файла IIS7 - PullRequest
       35

Длина загружаемого файла IIS7

1 голос
/ 12 сентября 2009

У меня следующий код для загрузки файла:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

Когда я запускаю его на своем локальном IIS6, он работает нормально. Веб-браузер (протестирован на IE8, Firefox 3.5.2, Opera 10) показывает длину файла до того, как я начну скачивать файл.

Когда я запускаю этот код на удаленном IIS7, веб-браузер не показывает длину файла. Длина файла неизвестна.

Почему я не получаю длину файла, когда этот код работает под IIS7?

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Используйте Fiddler , чтобы проверить, что на самом деле отправлено. Я предполагаю, что вы получаете чанкованное кодирование в результате установки буфера на false на сервере IIS7.

Кстати, отбросьте Response.End вызывать это довольно травмирующее действие, и оно не нужно (впрочем, и вызов Clear).

Редактировать

Строго говоря, при потоковой передаче контента с кусочным кодированием (что желательно в вашем сценарии) заголовок Content-Length не должен присутствовать (см. RFC2616, раздел 4.4 .) Мне кажется, что IIS7 использует Сам, чтобы обеспечить это. Фактически у меня был сценарий Classic-ASP, в котором IIS7 выдает ошибку, когда COM-код пытается добавить заголовок Content-Length, когда буферизация отключена.

Это действительно раздражает, потому что, несмотря на то, что комитет в башнях из слоновой кости хотел бы, этот заголовок дает конечному пользователю очень полезную информацию.

0 голосов
/ 30 апреля 2010

Спасибо за этот пост .... У меня это работает для IE с первой строкой.

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...