Дизайн для долгосрочного веб-запроса ASP.net MVC - PullRequest
1 голос
/ 20 ноября 2011

Мне известна модель, которая включает запуск запланированной задачи на заднем плане, которая выполняет задания, зарегистрированные с помощью веб-запроса, но как насчет этого для идеи, которая хранит все в ASP.net ...

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

  2. Запрос возвращается в браузер, а затем автоматический запрос Ajax возвращается на сервер и запрашивает, скажем, десять строк за раз и обрабатывает их. (Для каждой строки требуется несколько запросов веб-службы.)

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

  4. Если пользователь покидает веб-страницу, он может вернуться и перезапустить задание.

Есть мысли?

Приветствия, Ян.

Ответы [ 3 ]

2 голосов
/ 20 ноября 2011

Если я вас правильно понял, вам на самом деле не нужно никакого "взаимодействия" между фоновыми заданиями и долгосрочным запросом, вы просто хотите "запускать" фоновые задания с входящими запросами?Не такая хорошая идея.Взгляните на проект Quartz.NET, его планировщик встраивается в приложение ASP.NET, он будет обрабатывать все это без необходимости запросов.Конечно, если происходит отключение пула приложений, ваш планировщик также выходит из строя, но вы не можете гарантировать, что этого не произойдет даже с вашим решением для долго выполняющихся запросов, в зависимости от ожидания браузера на другой стороне.посмотрите на эту интересную статью Фила Хака на эту тему, с его собственной маленькой библиотекой планировщика, специфичной для ASP.NET:

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

1 голос
/ 20 ноября 2011

Программа на стороне сервера (или, в идеале, служба) может быть быстрой и грязной и более надежной. Вы все еще можете выполнить шаг 1, как вы предложили, загрузить файл и вставить данные (не забудьте увеличить значение тайм-аута maxRequestLength в web.config). Затем запустите на сервере программу, которая проверяет новые записи и обрабатывает их.

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

0 голосов
/ 20 ноября 2011

Может быть, я читаю вопрос и интерпретирую его странным образом, но почему вы не можете прочитать файл в базу данных и сохранить в таблице текущую строку файла, через которую вы завершили.Затем вы можете отслеживать свои успехи через БД и просто отправлять небольшие объекты json, сообщающие пользователю, как далеко вы находитесь.Таким образом, если их соединение обрывается, вы можете продолжать обрабатывать их запрос, а если они вернутся позже, вы можете уведомить их о том, как далеко продвигается задание.Кроме того, если подключается несколько клиентов, вы можете использовать базу данных для постановки в очередь и регулирования (путем сериализации) рабочей нагрузки.Или, если пользователь соединяет промежуточное задание с другим файлом, его новый запрос будет поставлен в очередь после текущего задания.

...