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