2016-04-29 2 views
0

У меня есть страница, где мы загружаем CSV-файл в базу данных. мы вызываем метод web api, который считывает файл и вставляет данные в таблицу. Когда мы загружаем файл, появляется всплывающее окно с кнопкой отмены. То, что я пытаюсь сделать, это отменить процесс загрузки файла, если пользователь нажмет кнопку отмены. Для этого я создал обещание и назвал его нажатием кнопки «Отмена», и он отменяет HTTP-запрос, но проблема, с которой я столкнулась, - это данные, которые уже импортированы в базу данных. Например, если у нас есть 100 строк в файле и к тому времени, когда я нажму кнопку отмены, в базу данных уже были вставлены 50 строк, эти строки остаются там. Мне нужна помощь в определении того, как вернуть данные, которые уже вставлены в таблицу. Вот код, который я работаю с:Отменить запрос 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(); 
} 

Edit: То, что я узнал, что это не отменить запрос на всех. Первоначальное впечатление о прекращении на полпути было неправильным и вызвано какой-то другой проблемой. Поэтому, когда я нажимаю кнопку отмены cancelLoadinfFile вызывается, но кажется, что canceller.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

Возможно, вам потребуется опубликовать больше кода с точки зрения бэкэнд. Как вы выполняете вставку, а используемая вами БД - важные детали, которые вы оставили. Самое чистое решение, вероятно, связано с откатом транзакций БД (не имеет отношения к логике внешнего интерфейса) – 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 по мере необходимости.

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