2014-01-11 3 views
5

Я реализовал простой загрузчик PDF в ASP.NET MVC, и мне нужно обработать загруженный документ. Поскольку обработка может занять некоторое время, я хочу, чтобы это было сделано в фоновом режиме. Рабочий процесс примерно такой: Я хочу, чтобы пользователь загружал документ, и когда документ сохраняется в базе данных, он должен иметь возможность делать другие вещи на веб-сайте, включая загрузку новых документов. Пользователь не должен ничего знать о обработке в фоновом режиме.Запуск фоновой задачи ASP.NET MVC 4.5

Моя реализация выглядит так:

[HttpPost] 
public async virtual Task<ActionResult> Confirm(string author, string title) 
{ 
    //... 
    previousDocumentIsProcessing = true; 
    await InvokeDocumentProcessor(_document.Path, _document.DocumentID); 
    previousDocumentIsProcessing = false; 

    return View("Success"); 
} 

Проблема заключается в том, что вид «Успех», что отображается после того, как обработка выполняется. Пользователи могут щелкнуть и сделать другие вещи, так как операция асинхронна, но то, что я хочу создать фоновый процесс, запустите его и сразу отобразите «Успех». Обработка данных не должна беспокоить пользователя.

Как я могу это достичь? Я пробовал работать с фоновым рабочим, но это не сработало (я получил сообщение о том, что процесс асинхронности не может быть запущен в этой точке).

ответ

6

Пользователь не должен ничего знать о обработке в фоновом режиме.

Уверены ли вы? Что делать, если во время обработки есть ошибка? Как пользователь знает, когда обработка выполнена?

Как я могу это достичь?

Как я расскажу в своем блоге, async does not change the HTTP protocol.

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

Если вы хотите неправильное (in-memory) решение, у меня есть another blog post describing that approach.

+0

Я уверен, что пользователь не должен знать о обработке, так как все, что я делаю, извлекая содержимое PDF (дословно) и сохранить его в чтобы сделать загруженные документы доступными для поиска. Решение на Windows Azure звучит очень хорошо, однако это простой университетский проект, и использование Windows Azure не является вариантом. Я рассмотрю «неправильное» решение и вернусь к вам. Спасибо за ответ :) – mobearette

+0

У вас может быть приложение Windows или консольное приложение, выполняющее ту же роль, что и роль рабочего Azure. Стивен просто предложил на реализацию шаблона. –

+0

Правильно. Примеры Лазури были просто примерами. Вы также можете использовать (соответственно): локальную файловую систему, MSMQ (или локальную базу данных) и службу Win32. –

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