Есть ли способ завершить пост обратно после записи файла в ответ? - PullRequest
3 голосов
/ 29 января 2011

У меня есть кнопка, которая при нажатии создаст PDF-файл и запишет его в ответ.

Это базовая структура кода:

try
{
    using(Stream stream = generatePdf())
    {
       var file = createFile(stream);
       file.Transmit(HttpContext.Current.Response);
    }
}
catch (Exception ex)
{
    // Handle exception
    // Display Error Message
}

Способ передачи содержит следующий код:

response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", filename));
response.AddHeader("Content-Length", bytes.Length.ToString());
response.ContentType = "application/octet-stream";
response.BinaryWrite(bytes);

Загрузка файла работает нормально, за исключением того, что он не завершает обратную передачу.

Если бы я выбросил исключение выше file.Transmit, обработка ошибок работала бы правильно, и я бы увидел сообщение, отображаемое в моем браузере. Однако, если после file.Transmit есть исключение, то ничего не происходит. Пользователь сохраняет / открывает PDF, и страница не перезагружается.

Как я могу сделать так, чтобы постбэк всегда завершался, чтобы я мог отобразить соответствующее сообщение пользователю?

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Звучит так, будто вы пытаетесь сделать ответ состоящим из двух частей: страницы и PDF. Вы не можете сделать это. Обычно страницы загрузки начинают загрузку как отдельный запрос, когда вы к ним обращаетесь (я полагаю, через JavaScript), с прямой ссылкой на тот случай, если JavaScript не работает.

Любой один HTTP-запрос может иметь только один ответ.

1 голос
/ 29 января 2011

Response.End () буквально заканчивает весь ответ.

Когда я его использую, я использую два метода:

1) Всегда проверяйте, что это последняя требуемая точка вpostback.

2) (и единственный способ использовать AJAX для файловых вызовов) Создать небольшую страницу в iframe исключительно для отправки файлов и вызвать обновление во фрейме ... response.endпросто завершит ответ от этого кадра, а не весь постбэк.

РЕДАКТИРОВАТЬ: Вот моя ветка вопросов на ту же тему Использование Response.TransmitFile для физического файла не работает

...