Почему Response.TransmitFile не возвращает мой файл в моей службе WCF? - PullRequest
0 голосов
/ 24 января 2019

Если бы вы могли объяснить мне, почему 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 мой файл и не отправляет его полностью? Почему это происходит?

EDIT

Через консоль браузера я вижу, что в Response.Header свойство content-length - это точная длина файла, но как только я нажимаю Save файл, этот размер файла изменяется от 1 до 15 КБ, вместо 30 КБ, которые находятся на сервере. (это как TransmitFile(file.FullName) не передает весь файл

Example

...