取消http.get请求并还原数据
问题描述:
我有一个页面,我们上传一个.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();
}
编辑:我发现它并没有取消请求。中途停下的最初印象是不正确的,是由于其他问题。所以当我按取消按钮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;
}
}
答
根据此链接http://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx,可以向控制器方法添加CancellationToken参数。当客户端取消请求时,令牌也将被取消。您需要将此令牌传递给该任务,或者根据需要监视IsCancellationRequested属性。
您可能需要从后端透视图发布更多代码。您如何执行插入操作以及您正在使用的数据库是您忽略的重要细节。最干净的解决方案可能涉及数据库事务回滚(与您的前端逻辑没有多大关系) – r0m4n
我编辑了我的实际问题,并放入了正在调用的Web API方法。希望这将有助于理解这个问题。 – user615611