2017-11-27 2 views
0

내 전자 상거래 사이트에 ~ 3000 개의 제품 CSV를 업로드하는 것이 목표입니다. 내 e-comm 플랫폼에서 제공하는 REST API를 활용하여 내가 만들 수있는 미래의 사이트를 위해 재사용 및 구축 할 수있는 무언가를 갖고 싶습니다. 내가 문제를 통해 작업을 데REST API를 통한 대량 업로드

내 주요 문제는 다음과 같습니다 - 나는 단지 POST를 통해 모든 3K 기록을 통해이 처리하는 데 걸리는 시간에 속성 수 System.Threading.ThreadAbortException

의뢰. 내 코드 :

public ActionResult WriteProductsFromFile() 
    { 
     string fileNameIN = "19107.txt"; 
     string fileNameOUT = "19107_output.txt"; 
     string jsonUrl = $"/api/products"; 

     List<string> ls = new List<string>(); 

     var engine = new FileHelperAsyncEngine<Prod1>(); 

     using (engine.BeginReadFile(fileNameIN)) 
     { 
      foreach (Prod1 prod in engine) 
      { 
       outputProduct output = new outputProduct(); 

       if (!string.IsNullOrEmpty(prod.name)) 
       { 
        output.product.name = prod.name; 
        string productJson = JsonConvert.SerializeObject(output); 

        ls.Add(productJson); 
       } 
      } 
     } 

     foreach (String s in ls) 
      nopApiClient.Post(jsonUrl, s); 

     return RedirectToAction("GetProducts"); 
    } 
} 

나는 웹 코딩에 익숙하지 않으므로 잘못된 방향으로 가고 있습니까? 대량 업로드를 위해 내가 선호하지 않는 방법이 있습니까?

TaskCreationOptions.LongRunning 플래그를 사용하려고했는데, 그 원인을 약간은 돕지 만 내 목표를 달성하지 못합니다.

+1

'public ActionResult WriteProductsFromFile()'의 코드는 원래 요청이 들어온 스레드를 가지고 있다는 것을 알아야합니다. 클라이언트의 연결이 끊어지면 일반적으로 호스트 (Kestrel/IIS)는 상대방에서 듣고있는 내용이 없음을 감지합니다. API가 '가져 오기 시작'메시지를 수락하고 백엔드 장기 실행 프로세스 (예 : 서비스/데몬)가 실제로 모든 내보내기를 수행하는 대기열 처리 시스템을 활용하면됩니다. – zaitsman

답변

0

웹 및 API 컨트롤러 작업은 오랫동안 실행되는 작업을 의미하지 않습니다. UI/스레드를 잠그는 것 외에도 복구에 거의 도움이되지 않을 수있는 일련의 오류가 발생할 수 있습니다.

하지만 여기에는 많은 옵션이 있습니다. 파일 및 이러한 종류의 시나리오를 다루는 방법을 설명하는 비동기/클라우드 아키텍처에 대한 많은 문서가 있습니다. 당신이 원하는 무엇

그것은 조금 더 많은 일을하지만 궁극적으로 더 신뢰할 수있는 응용 프로그램을 만들 것입니다

(응용 프로그램이 아닌 제 3 자에) API 요청에서 파일의 처리를 분리합니다.

1 단계 :

드롭 즉시 디스크에 파일 - 나는 거기 도착하지만 어느 쪽이든 그것은 같은 해결 방법을 이미 확인 디스크에있는 파일을하지 않은 참조하십시오.

2 단계 :

사용
으로 실행되는 프로세스 - (가장 쉬운)
콘솔 응용 프로그램 - 서비스가
(설치의 일종/서비스의 제거를 필요) - 또는 웹 응용 프로그램의 스레드 일 수도 있습니다. 그러나 실패 할 경우 알기 위해 고민 할 것입니다.

어떤 방법을 선택 하든지 프로세스가 파일 변경을위한 디렉토리를 보게됩니다. r 메서드를 사용하여 원하는대로 파일을 행복하게 처리 할 수 ​​있습니다.또한 https://www.dotnetperls.com/filesystemwatcher

: 당신이 당신의 API/웹 애플리케이션의 스레드를 실행에 관심이 있다면

  • , 살펴

    체크 아웃 여기에 FileSystemWatchers는 기본 예입니다 일부 옵션은 https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx입니다.

  • 물론 FileSystemWatcher를 사용할 필요는 없습니다. 주기적으로 점검되는 DB의 플래그 또는 시스템 이벤트를 통해 트리거 할 수 있습니다.
+0

감사합니다. 추천! –

관련 문제