2016-04-29 3 views
0

私は、.csvファイルをデータベースにアップロードするページを持っています。ファイルを読み込んでデータをテーブルに挿入するWeb APIメソッドを呼び出します。ファイルをアップロードすると、キャンセルボタンが表示されたポップアップが表示されます。私がやろうとしているのは、ユーザーがキャンセルボタンを押すと、ファイルのアップロードプロセスをキャンセルすることです。そのために私は約束を作成し、キャンセルボタンをクリックして呼び出すと、http要求を取り消していますが、私が直面している問題は、すでにデータベースにインポートされているデータがそこに残っていることです。たとえば、ファイルに100行あり、キャンセルボタンを押すと、その行がすでにデータベースに挿入されています。私はテーブルに既に挿入されているデータを元に戻す方法を理解するためにいくつかの助けが必要です。http.get要求をキャンセルしてデータを復帰させよう

var requestPromise = $http({ 
    method: 'POST', 
    url: mpCONFIG.apiServiceBaseUri + 'import/fileImport', 
    data: formData, 
    transformRequest: angular.identity, 
    timeout: canceller.promise, 
    headers: { 
    'Content-Type': undefined 
    } 
}); 
return requestPromise.success(function(resp, status) { 
    file.progress = undefined; 
    if (typeof resp != 'undefined' && resp != null && resp.length > 0) { 

     $rootScope.caseFileId = resp[0]; 
     listImportRows(1, resp[0]); 
    } 
    }) 
    .error(function(data, status) { 
    $scope.waitOnLoadingFile(false); 
    file.progress = undefined; 
    }); 
}; 

$rootScope.cancelLoadingFile = function() { 
    canceller.resolve("User Cancelled"); 
    $scope.waitOnLoadingFile(false); 
    $window.location.reload(); 
} 

編集:私はそれがすべての要求をキャンセルされていないことが判明何をここで私が働いているコードです。途中で停止するという初期の印象は正しくなく、他のいくつかの問題が原因でした。 Cancelボタンを押すとcancelLoadinfFileが呼び出されますが、canceler.resolveが要求をキャンセルしていないようです。以下はWeb APIのメソッドです。

[Route("fileImport")] 
    [HttpPost] 
    public System.Threading.Tasks.Task<IHttpActionResult> UploadImage() 
    { 
     try 
     { 
      IEnumerable<Models.mlsp.Firm> firms = (from cs in User.Firms(db) 
                select cs); 

      HttpRequestMessage request = this.Request; 
      if (!request.Content.IsMimeMultipartContent()) 
      { 
       throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType)); 
      } 

      MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(Properties.Settings.Default.UploadTempFolder); 

      string user = RequestContext.Principal.Identity.Name; 

      System.Threading.Tasks.Task<IHttpActionResult> task = request.Content.ReadAsMultipartAsync(provider). 
       ContinueWith<IHttpActionResult>(o => 
       { 
        System.Net.HttpStatusCode resultStatus = HttpStatusCode.OK; 
        int?[] result = new int?[provider.FileData.Count]; 

        try 
        { 
         for (int i = 0; i < provider.FileData.Count; i++) 
         { 
          result[i] = Logic.mlsp.Case.LoadFromFile(User, db, provider.FileData[i].LocalFileName, firms); 
         } 
         return ResponseMessage(new HttpResponseMessage() 
         { 
          StatusCode = resultStatus, 
          Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(result)) 
         }); 
        } 
        catch (Exception ex) 
        { 
         Helpers.LogHelper.LogError(ex); 
         throw; 
        } 
       } 
      ); 
      return task; 
     } 
     catch (Exception ex) 
     { 
      Helpers.LogHelper.LogError(ex); 
      throw; 
     } 
    } 
+0

おそらく、バックエンドパースペクティブからコードを投稿する必要があります。どのように挿入を実行しているのか、使用しているDBは重要な詳細です。最もクリーンな解決策はおそらくDBトランザクションのロールバック(フロントエンドのロジックにはあまり関係しません)です。 – r0m4n

+0

私は実際の質問を編集し、呼び出されているWeb APIメソッドを入れました。質問を理解するのに役立つことを願っています。 – user615611

答えて

0

このリンク、http://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspxによると、あなたは、コントローラのメソッドにCancellationTokenパラメータを追加することができます。クライアントが要求をキャンセルすると、トークンもキャンセルされます。このトークンをタスクに渡すか、必要に応じてIsCancellationRequestedプロパティを監視する必要があります。

関連する問題