длительный процесс http - как поставить в отдельный процесс? - PullRequest
2 голосов
/ 21 июля 2010

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

У меня есть веб-сайт, на котором пользователь загружает файл данных, затем этот файл преобразуется и импортируется в SQL. Размер файла может достигать 50 МБ, а иногда этот процесс может занимать 30 минут, а иногда даже дольше.

Я понимаю, что мне нужно подсунуть фактическую работу другому процессу и опросить этот процесс на веб-странице. Мне интересно, какой будет лучший подход? Будучи веб-разработчиком по профессии, я нахожу все эти новые вещи в Windows Service немного запутанными, и я просто хотел где-то начать.

Итак:

  • Могу ли я сделать / я должен делать это с помощью службы Windows? если да, то как?
  • Должен ли я использовать WCF? Если это работает в IIS, будут ли у меня проблемы с утилизацией aspnet_wp.exe и тайм-аутом моего процесса?

* уточнений 1016 *

Данные импортируются в sql, распространение файлов не происходит.

В случае сбоя, он абсолютно ДОЛЖЕН быть сообщен пользователю. Веб-страница будет опрашивать каждые, скажем, 5 секунд с момента начала асинхронной задачи, чтобы получить «статус» импорта. Как только он будет завершен, другой ответ сообщит странице прекратить опрос для обновления статуса.

запросы на окончательное решение

Хорошо, как я и думал, похоже, что Windows-сервис - лучшая идея. Что касается того, КАК заставить его работать, кажется, что идея «положить файл туда и ждать, пока служба его заберет», является общепринятым способом, есть ли способ, которым я могу запустить процесс, запущенный службой, без это постоянно проверять таблицу / папку базы данных? Как я уже говорил ранее, у меня нет опыта работы со службами Windows - мне было интересно, если я добавлю публичный метод в службу, могу ли я как-нибудь его назвать?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

хорошо ...

var thread = new Thread(() => {
    // your action
});
thread.Start();

но у вас будут проблемы с этим:

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

Не всегда хорошая идея хранить все в sql (особенно в файлах ...). если вы хотите сделать файл доступным для нескольких серверов, почему бы не распространять их по ftp ...?

Я полагаю, что вся ваша концепция немного испорчена (извините, если предположить это), и было бы полезно, если вы уточните и дадите нам больше информации о ваших намерениях!

редактировать:

Могу ли я сделать / я должен делать это с сервисом windows? если да, то как?

вы можете :) Я советую вам создать простую консольную программу и конвертировать ее с srvany и sc. Вы можете получить приблизительный обзор, как здесь (примечание: вставлять пробелы после = ... это глупая ошибка)

термин should является относительным, потому что вы не ответили на самый важный вопрос

что, если запись сохраняется в базе данных, сообщая потребителю, что файл test.img должен быть сохранен, но ваша служба не захватила его или еще не преобразовала его?

так что ... дальше

Должен ли я использовать WCF? Если это работает в IIS, у меня будут проблемы с утилизацией aspnet_wp.exe и тайм-аутом моего процесса?

вы, вероятно, могли бы создать WCF-сервис, который получает некоторые двоичные данные и затем сохраняет их в базе данных. этот запрос может быть асинхронным. да. а зачем?

еще раз: пожалуйста, дайте нам больше информации о вашем рабочем процессе: чего именно вы пытаетесь достичь? какие "условия среды" у вас есть (например, app A опрашивает базу данных и ожидает сохранения файлов-записей, на которые есть ссылки в таблице x) ...

редактирование:
поэтому вы хотите импортировать .csv -файл. хорошо что все меняет :) 1057 *

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

Я бы предложил следующее:
сначала сделайте все в своем веб-приложении (как вы уже сделали), но лучше используйте какую-то массовую вставку и выполните преобразование / логику в базе данных.

если у вас какое-то узкое место, я бы предложил вам что-то вроде мелкой работы, например:

webapp загрузит файл и вставит строку в таблицу заданий. служба заданий непрерывно опрашивает таблицу / или получает уведомление через wcf через веб-приложение (эй, эй, наконец, какое-то использование WCF в вашем сценарии ... :)), а затем выполняет задание импорта, записывая финиш -примечание к таблице / или установить состояние задания завершено ...
но это немного излишне :) 1069 *

1 голос
/ 21 июля 2010

Пожалуйста, посмотрите, помогут ли мои нижеследующие комментарии решить вашу проблему:

• Могу ли я сделать / я должен делать это с помощью службы Windows?если да, то как?

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

В основном идея заключается в том, что ..

  • Вы отправляете запрос на обработку файла csv в таблице базы данных с некоторым статусом как не запущенный.
  • Затем ваша служба Windows получает запрос из таблицы базы данных, которые не были запущены, и обновляет их, как в состоянии выполнения..
  • После того, как обработка завершена успешно / неуспешно, ваша служба обновила таблицу базы данных со статусом Завершено / Сбой.
  • И ваша страница asp.net может опрашивать таблицу базы данных для текущего статуса каждый5 секунд или около того.

• Должен ли я использовать WCF?Если это выполняется в IIS, возникнут ли у меня проблемы с утилизацией aspnet_wp.exe и тайм-аутом моего процесса?

вам не следует использовать WCF для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...