Почему Response.TransmitFile не возвращает мой файл в моей службе WCF?
Если вы могли бы объяснить мне, почему TransmitFile не работает, код прост, я создаю файл Excel (.xlsx
), сохранить его на сервере и вернуть путь к файлу (через CreateProjectsReport), а затем я просто хочу взять файл и передать его пользователю....
string filePath = CreateProjectsReport(ProjectIds, items);
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)
{
HttpContext context = HttpContext.Current;
try
{
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.AddHeader("Content-Disposition",
"attachment; filename=" + file.Name);
context.Response.AddHeader("Content-Length", file.Length.ToString());
// context.Response.ContentType = "application
// vnd.openxmlformats-officedocument.spreadsheetml.sheet";
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.TransmitFile(file.FullName);
context.Response.Flush();
// context.Response.WriteFile(file.FullName, false);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
System.IO.File.Delete(filePath);
context.Response.End();
}
}
Результатом этого кода является то, что файл сохраняется на моем сервере в ожидаемой папке (полный отчет есть, я проверял файл Excel, который создается методом) и на response.Flush()
Я вижу, что файл передается в браузерах с длиной содержимого 30kb
так как длина файла на сервере, но как только я нажимаю сохранить и файл сохраняется в моей папке загрузки, его длина 10kb
Открыв его в Excel, я получаю сообщение об ошибке: Excel foudn unreadable content in 'filename.xlsx'. Do you want to recover ....
,
Проверка типов IIS MIME установлена (я попробовал использовать оба типа содержимого, получаю ту же ошибку):
.xls - application/vnd.ms-excel
.xlsx - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Подавляет ли context.Response.TransmitFile мой файл и не отправляет его полностью? Почему это происходит?
РЕДАКТИРОВАТЬ
Через консоль браузера я вижу, что в Response.Header
имущество content-length
точная длина файла, но как только я нажимаю Save
файл, этот размер файла составляет от 1 КБ до 15 КБ, вместо 30 КБ, который находится на сервере (это как TransmitFile(file.FullName)
не передает весь файл