2014-01-23 3 views
0

У меня есть сайт, вызывающий службу ASMX, запущенную на сервере (относительно старый). Я борюсь с проблемой, связанной с запросом ajax, который требует около 10-20 секунд, чтобы запустить метод успеха, если не был установлен тайм-аут.Служба ASMX с тяжелой обработкой

В основном пользователь заполняет набор информации и настроек и изображений. По завершении пользователь нажимает кнопку, которая отправляет изображение base64 на сервер и огромный объект json с ним. (Какая информация выбрана пользователем). В любом случае, служба отвечает за выполнение следующих действий:

  • Создать изображение из base64 строки
  • разобрать объект JSON и организовать его, а затем создает PDF-документ на 4 страницы с этим изображением в нем.
  • Создайте лист Excel всей запрашиваемой информации.
  • Отправить по электронной почте пользователю с PDF прикрепленного
  • Отправить по электронной почте компании со всеми другими приложениями (PDF, Excel и изображения)

Это огромная нагрузка, особенно при использовании SMTP объект для отправки не одного, а двух электронных писем.

В принципе, можем ли мы сделать это асинхронно, не заставляя пользователя ждать «Успеха !!»? сообщение?

Спасибо, ребята.

+3

Как насчет того, когда сервер получает запрос, помещает его в очередь и сразу же возвращает идентификатор очереди. Затем клиент может опросить каждые несколько секунд, чтобы проверить, завершен ли этот идентификатор очереди. –

+0

Ну, когда сервер завершается, пользователь должен перейти на домашнюю страницу. Итак, если ему нужно проверить это означает, что ему нужно подождать и ждать столько же времени. Я думал больше о том, чтобы дать ему успех и уйти, но сервер все еще обрабатывает и все –

+0

Я бы не сказал * Успех *, если работа еще не закончена. Я бы сказал что-то вроде «Ваша работа в настоящее время работает ...» и предоставит какой-то механизм для возврата и проверки состояния позже. Возможно, ваша панель навигации может иметь сообщения о статусе для выполнения заданий очереди. Facebook делает что-то подобное с загруженным видео; когда он завершит обработку, вы получите уведомление через всплывающее сообщение. –

ответ

1

Вы можете реализовать стандартную задачу очереди на сервере, сохранить параметры вызова и выполнить фоновое задание из очереди.

Когда работа такая же тяжелая, как вы описываете, это, вероятно, будет очень хорошей идеей.

Задайте задачу, отправив успешное сообщение на адрес электронной почты клиентов или напишите в журнал регистрации веб-приложений (читаемый с другой веб-страницы).

Следует помнить об использовании утилизации IIS. Тяжелые серверные задачи могут задерживать рециркуляцию, если задача должна быть завершена до того, как начнется рециркуляция. См. http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/ для получения дополнительной информации об этом.

Это требует больше работы, но веб-сервер может вызвать самообслуживаемую службу WCF, запущенную как службу Windows, которая, в свою очередь, выполняет задания в очереди.

Смежные вопросы