2017-11-27 19 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"); 
    } 
} 

私はWebコーディングに新しいので、間違った方法をしていますか?一括アップロードする方法はありますか?

私は少しの原因に役立ちますが、私の目標の近くにどこでも私を取得していませんTaskCreationOptions.LongRunningフラグを使用しようとしました。

+1

あなたの '' Public ActionResult WriteProductsFromFile() 'のコードは、元のリクエストが入ったスレッドを保持していることを理解しておく必要があります。クライアントの接続を切断すると、 IIS)は、相手側で何も聞いていないことを検出します。 あなたが行う必要があるのは、APIが 'start importing'メッセージを受け入れ、バックエンドの長期実行プロセス(サービス/デーモンなど)が実際にすべてのエクスポートを実行する何らかのキューイングシステムを利用することです。 – zaitsman

答えて

0

WebおよびAPIコントローラのアクションは、長時間実行されるタスクを意図したものではありません。UI /スレッドをロックするだけでなく、復旧時にほとんど犠牲にならない一連の失敗の可能性があります。

ここではたくさんのオプションがありますが、ファイルやそのようなシナリオの処理方法については、非同期/クラウドアーキテクチャに関する多くの文献があります。あなたが何をしたいか

は、それはもう少し作業がかかりますが、最終的に、より信頼性の高いアプリケーションを作成します(あなたのアプリケーションではありませんサードパーティで)APIリクエスト

からあなたのファイルの処理を抜いています。

ステップ1:

ドロップファイル即座にディスクへ - 私はあなたがそこに取得しますが、いずれかの方法は、それが同じようにうまくいくかまだわからないディスク上のファイルを持っている参照してください。

ステップ2:


として動作しているプロセスを使用してください - コンソールアプリケーション(最も簡単)
- サービス(サービスのインストール/アンインストールのいくつかの並べ替えが必要です)
を - かあなたのWebアプリケーション内のスレッドでさえも(しかし、失敗したときにはわかりません)

これまでどんな方法を選んでも、プロセスはファイルの変更のためのディレクトリを監視します。あなたが好きなように喜んでファイルを処理するための方法です。

ここFileSystemWatchersをチェックアウトは、基本的な例である:https://www.dotnetperls.com/filesystemwatcherさらに

  • あなたのAPI/Webアプリケーション内のスレッドを実行していることに興味があるなら、見てみましょう一部のオプションではhttps://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspxです。
  • もちろん、FileSystemWatcherを使用する必要はありません。定期的にチェックされているDB内のフラグやシステムイベントによってトリガーできます。
+0

ありがとうおすすめ! –

関連する問題