我有以下Ajax调用
function exampleAjax() {
$('#loadingImage').show();
var id = GetId();
$.ajax({
url: "../Controller/MyRequest?id=" + id,
type: "GET",
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (result) {
if (result.success === true) {
// Show Dialog Success
}
else {
// Show Dialog Failure
}
},
async: true,
processData: false
});
}
调用控制器的方法。
public async Task<JsonResult> MyRequest(string teamId)
{
bool success = false;
try
{
HttpResponseMessage response = await client.GetAsync(fullUriEndpoint)
if (!response.IsSuccessStatusCode)
throw new Exception(response.ReasonPhrase);
else
success = true;
return Json(new
{
success = success,
}, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json(new
{
success = success,
}, JsonRequestBehavior.AllowGet);
}
}
因为请求需要几分钟才能处理(这完全没问题,服务器需要进行一些可能需要5分钟或更长时间的处理)然后客户端发回异常,尽管任务仍然在后端执行
有没有办法可以管理这个场景而不会发生火灾而忘记?我想等待执行此请求,直到它完成。
答案 0 :(得分:1)
作为一种选择,您可以构建一种轮询过程:
另一种选择是使用WebSockets在服务器和客户端之间提供双向通信。
答案 1 :(得分:1)
可能你最好的选择是使用SignalR。所以ignoring that you should't run long running processes on asp.net ..我建议使用能够以不同且更简单的方式完成所需工作的东西。 SignalR抽象Ajax / WebSockets所以你所要做的就是以任何方式进行调用(客户端到服务器或服务器到客户端)。
客户端到服务器(javascript):
$.connection.myHub.StartProcess()
服务器
public class MyHub : Hub
{
public void StartProcess()
{
// DO WORK
// Call Client!
Clients().Client(id).ProcessFinished()
}
}
客户端(Javascript)
$.connection.myHub.ProcessFinished = function(){
console.log('Long process finished!');
}
答案 2 :(得分:0)
您可以使用允许持续连接同时进行双向通信的websockets来实现场景,而不是使用HTTP和长轮询。实际上,您可以使用其中一个实时API来实现Firebase,PubNub,deepstream等应用程序。