#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
команду, она возвращает количество кадров.