Как предотвратить тайм-ауты браузера в ASP.NET? - PullRequest
2 голосов
/ 09 мая 2011

Сценарий:

пользователь загружает небольшой файл или около 100 КБ в приложение ASP.NET 4.0 с возможно 1000 единицами работы.Затем сервер начинает работать с единицами работы, по одному за раз.Каждый блок занимает несколько секунд, чтобы запросить информацию из внешней службы.Результаты сохраняются в базе данных только в том случае, если все объекты были успешно завершены с использованием транзакции.После завершения пользователь может получить список того, что было сделано.

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

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

Я хочу предотвратить этот тайм-аут.

Вот несколько идей, которые у меня были:

  1. Оптимизируйте код, чтобы он работал быстрее.Это сделано и больше не является проблемой.
  2. Параллельно выполняйте запросы к внешней службе.
  3. Немного увеличьте время ожидания сервера.
  4. Позвольте пользователю загружатьфайл, а затем отправьте ему электронное письмо с результатами позже, когда файл будет обработан.
  5. Каким-то образом обновите страницу и покажите пользователю некоторую информацию о ходе работы, ожидая, например, 5% выполнено - сделано за 10 минут.

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

Другие предложения приветствуются.

Спасибо,

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

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

  • Создание постоянного элемента (т. Е. В базе данных, файле и т. Д.) В очереди, чтобы оно было отказоустойчивым
  • и возвращало успешный результат.в браузер
  • Создание работника очереди для асинхронной обработки вашей очереди.
2 голосов
/ 09 мая 2011

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

Для прогресса пользователь может затем запросить у таблицы очередей статус своей загрузки.

0 голосов
/ 09 мая 2011

Простой трюк - написать кусок javacsript для повторного запроса чего-либо с текущей страницы. Если вы используете действие запроса HEAD, сервер будет каждый раз отвечать только минимальным количеством информации.

Что-то вроде:

<script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
setTimeout("callserver()",6000);
});

function callserver() {
var remoteURL = '/yourpage.aspx';
$.get(remoteURL, function(data) { setTimeout("callserver()",6000); });
}
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...