HttpRequest不会在冗长的请求上超时

时间:2017-10-24 21:22:04

标签: javascript c# asp.net ajax

我有以下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分钟或更长时间的处理)然后客户端发回异常,尽管任务仍然在后端执行

有没有办法可以管理这个场景而不会发生火灾而忘记?我想等待执行此请求,直到它完成。

3 个答案:

答案 0 :(得分:1)

作为一种选择,您可以构建一种轮询过程:

  1. 客户端发送“长时间操作”请求。
  2. 服务器启动操作,给它一些id。
  3. 立即回复客户说操作已经开始。
  4. 然后服务器侦听像GET / api / operation /:id这样的API来响应给定操作的状态(已完成或正在进行中)。
  5. 客户从(3)获得此预答案并运行一个计时器,他从(4)请求API每个让我们说500毫秒直到操作完成或直到N次尝试完成。
  6. 另一种选择是使用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等应用程序。