2014-01-11 1 views
5

ASP.NET MVC에서 간단한 PDF 업 로더를 구현했으며 업로드 된 문서를 처리해야합니다. 처리에는 시간이 걸릴 수 있으므로이 작업을 백그라운드에서 수행하고 싶습니다. 워크 플로우는 다음과 같습니다. 사용자가 문서를 업로드하고 문서를 데이터베이스에 저장하면 새 문서 업로드를 포함하여 웹 사이트에서 다른 작업을 수행 할 수 있어야합니다. 사용자는 백그라운드에서 처리하는 것에 대해 아무 것도 알지 않아야합니다.백그라운드 작업 시작 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 블롭 저장소) 신뢰할 수있는 메시지 대기열 (예 : Azure 대기열 저장소)에 메시지를 삽입하고 처리를 완전히 독립적 인 백엔드로 만드는 것입니다 (예, Azure 작업자 역할).

부적절한 (메모리 내) 솔루션을 원할 경우 another blog post describing that approach입니다. 어떤이 솔루션에 대한

+0

내가 뭐하는 거지 모두가 (말씀으로 워드) PDF 파일의 내용을 추출로 저장하기 때문에 사용자가 처리를 인식하지 않아야 확신 데이터베이스를 검색하여 업로드 된 문서를 검색 할 수 있도록합니다. Windows Azure의 솔루션은 정말 훌륭하지만, 이것은 단순한 대학 프로젝트이며 Windows Azure를 사용하는 것은 옵션이 아닙니다. "부적절한"해결책을 검토하고 다시 연락 드리겠습니다. 답변 해 주셔서 감사합니다 :) – mobearette

+0

Azure 작업자 역할과 동일한 역할을하는 Windows 서비스 또는 콘솔 응용 프로그램을 가질 수 있습니다. Stephen은 패턴의 구현을 제안했습니다. –

+0

수정. Azure 예제는 예제 일뿐입니다. 로컬 파일 시스템, MSMQ (또는 로컬 데이터베이스) 및 Win32 서비스를 사용할 수도 있습니다. –