Как прервать загрузку и предупредить пользователя?

#c# #webclient #httphandler #httpcontext #ashx

#c# #webclient #httphandler #httpcontext #ashx

Вопрос:

Я пишу IHttpHandler , чтобы получать большие файлы через ftp-сервер и передавать их пользователям. Если мой обработчик выдает ошибку (например. «Удаленный сервер вернул ошибку: (426) Соединение закрыто; передача прервана».), клиент получает незавершенный файл, но он / она не знает об этом. Клиент видит сообщение «Загрузка успешно завершена».

Как я могу заставить браузер предупредить пользователя и сказать, что «Загрузка завершена с ошибками, пожалуйста, попробуйте еще раз» / «Загрузка прервана» / «Загрузка отменена» или что-то в этом роде?

 public class FTPServ : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.AppendHeader("Content-Disposition", "attachment; filename=test.mxf");
        context.Response.ContentType = "application/mxf";

        using (WebClient client = new WebClient())
        using (Stream stream = client.OpenRead("ftp://user:pass@IP/file"))
        {
            try
            {
                var buffer = new byte[65536 * 2];
                int bytesReceived;
                while ((bytesReceived = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    context.Response.BinaryWrite(buffer);
                    context.Response.Flush();
                }
            }
            catch (Exception ex)
            {
                //What to do
            }
        }
    }

    public bool IsReusable { get { return true; } }
}
  

Обновить

Пользователь предложил добавить длину содержимого, но я не знаю длину содержимого, и для меня это невозможно узнать.

Комментарии:

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

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

3. Как указано выше, вы можете делать что угодно в блоке catch. Например, запись сообщения в поток ответов.

4. Что бы я ни записывал в поток ответов, это не меняет поведение загрузки. Текущая загрузка завершена, и браузер сообщил, что загрузка прошла успешно. Как только загрузка начинается, она в конечном итоге завершается. Что я пытаюсь сделать, я хочу остановить загрузку и заставить браузеры предупреждать пользователя. Для меня достаточно сообщения «Загрузка отменена» или «Загрузка прервана».

5. Вам следует попробовать использовать что-то другое, чем WebClient для доступа по FTP. FTP на самом деле имеет более богатую командную модель, чем ‘get’ и ‘store’.

Ответ №1:

Установите заголовок content-length, чтобы клиент знал, чего ожидать.

Комментарии:

1. Спасибо, но я забыл сказать, что я не знаю размер содержимого, и у меня нет возможности узнать это…

2. @ogun Если вы извлекаете его с FTP-сервера, вы должны иметь возможность получить размер файла с помощью SIZE команды. Большинство современных FTP-серверов поддерживают эту команду.

3. Я использую какой-то измененный протокол FTP. Размер информации о файле изменяется в зависимости от количества кадров видеофайла. Когда вы пытаетесь использовать SIZE команду, она возвращает количество кадров.