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

Я пишу 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; } }
}

Обновить

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


person ogun    schedule 04.07.2014    source источник
comment
Как сказать пользователю, что это удалось? Как вызывается этот код?   -  person Liam    schedule 04.07.2014
comment
Это архитектурный вопрос, на который нельзя ответить в вашем контексте, фактически не зная вашего контекста. Вы можете повторно вызвать исключение, зарегистрировать исключение, превратить его в исключение, которое обрабатывается более высоким уровнем, отобразить окно сообщения.   -  person Samuel    schedule 04.07.2014
comment
Как указано выше, в блоке catch можно делать все, что угодно. Например, написание сообщения в поток ответов.   -  person Complexity    schedule 04.07.2014
comment
Что бы я ни писал в поток ответов, это не меняет поведения загрузки. Текущая загрузка завершена, и браузер сообщил, что загрузка прошла успешно. Как только загрузка начнется, она в конечном итоге будет завершена. Что я пытаюсь сделать, я хочу остановить загрузку и заставить браузеры предупреждать пользователя. Мне достаточно сообщения «Загрузка отменена» или «Загрузка прервана».   -  person ogun    schedule 04.07.2014
comment
Вам следует попробовать использовать для доступа по FTP что-то другое, кроме WebClient. На самом деле FTP имеет более богатую модель команд, чем get и store.   -  person ErikHeemskerk    schedule 04.07.2014


Ответы (1)


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

person spender    schedule 04.07.2014
comment
Спасибо, но я забыл сказать, что я не знаю размера содержимого и у меня нет возможности узнать это ... - person ogun; 04.07.2014
comment
@ogun Если вы загружаете его с FTP-сервера, вы сможете получить размер файла с помощью команды SIZE. Большинство современных FTP-серверов поддерживают эту команду. - person ErikHeemskerk; 04.07.2014
comment
Я использую какой-то измененный протокол FTP. Размер информации о файле изменяется в зависимости от количества кадров файла фильма. Когда вы пытаетесь использовать команду SIZE, она возвращает количество кадров. - person ogun; 04.07.2014