Какие процессы используются консольным приложением, запускаемым из веб-приложения - PullRequest
0 голосов
/ 07 марта 2012

В веб-приложении мне нужно выполнить преобразование файлов (например, из JPEG в PDF), когда локальный файл загружен на сервер.Я решил делегировать эту задачу консольному приложению, чтобы отделить его от общего веб-приложения.Код консольного приложения запускается каждый раз, когда пользователь загружает локальный документ и в случае успеха возвращает имя преобразованного файла (test.jpg в качестве ввода будет возвращен как test.pdf).

Так как мне нужнознать, был ли файл правильно преобразован, прежде чем продолжить, теряю ли я преимущества делегирования задачи внешнему процессу (так как код консольного приложения будет выполняться в отдельном процессе, верно)?

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

Вот код, который я разработал для вызова консольного приложения:

HttpPostedFile file = HttpContext.Current.Request.Files[0];
FileInfo fileInfo = new FileInfo(file.FileName);
string extension = fileInfo.Extension;
ConvertCommand conv = new ConvertCommand();
string convertedFile = conv.Run(file.InputStream, extension, targetFilePath);

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Как правило, рекомендуется не выполнять долгосрочные задачи в контексте веб-запроса;Преобразование файлов, вероятно, является такой «длительной» задачей.Синхронное выполнение преобразования является проблемой, не обязательно независимо от того, выполняете ли вы код внутри кода, приложение оболочки или веб-службу.

Рабочие потоки - это ограниченные ресурсы на веб-серверах (сравнительно);большинство веб-серверов ожидают, что веб-запрос будет обработан в течение секунды или около того.Если запросы занимают больше времени, сервер должен управлять большим количеством рабочих потоков;это, в свою очередь, может замедлить обработку для каждого отдельного потока, что означает, что они занимают больше времени, и все это может стать нелинейным очень быстро.

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

0 голосов
/ 07 марта 2012

Вместо консольного приложения я бы рекомендовал использовать сервис Windows для конвертации изображений. Связь с ним может осуществляться через WCF.

...