【问题标题】:Run a method async while redirected to other pages在重定向到其他页面时运行异步方法
【发布时间】:2020-07-18 11:36:15
【问题描述】:

我有一个使用 J 查询和 Ajax 的 asp.net MVC 应用程序。还有一个cshtml页面包含一个运行了很长时间的进程,所以我做了一个异步方法并使用ajax我能够触发它,所以希望用户可以在长进程运行时在不同的页面中做一些其他工作背景。

当我在同一页面上工作时,它工作正常。但是当我在后端运行代码时重定向到另一个页面时,我没有得到任何输出。在另一种方法运行时是否无法重定向?如果是这样,我该如何完成。

我的 c# 控制器

public async System.Threading.Tasks.Task<JsonResult> TestAsyncPro(string ComponentId)
{
        try
        {
            await System.Threading.Tasks.Task.Delay(4000); 

            return Json(new { Success = true, Error = "" }, JsonRequestBehavior.AllowGet);

        }

        catch (Exception ex)
        {
            return Json(new { Success = false, Error = ex.Message }, JsonRequestBehavior.AllowGet);
        }

}

Ajax 调用

$('#testasnc').click(function ()
{   
    $.ajax({
        url: '../AccountOpening/TestAsyncPro',
        type: 'POST',
        dataType: 'json',
        cache: false,
        async: true,
        data: { ComponentId: '21' },
        success: function (data) {
            if (data.Success == true)
            {
                $(window).scrollTop(0);
                $("#alrtTestAsnc").show();  
                setTimeout(function () { $("#alrtTestAsnc").hide(); }, 5000);  
            } 
        }
    });

    var url = $("#RedirectTo").val();
    location.href = url;
   
});

【问题讨论】:

  • 重定向到另一个页面将中止任何正在进行的请求。当前页面中的所有脚本也都消失了,因此success 将永远不会被调用
  • 那么我该怎么做呢?任何解决方法都会有所帮助
  • 看看使用Hangfire 或类似的。正如@charlietfl 所说,请求在页面退出时结束。如果你有一个长时间运行的任务,你可以让 Hangfire 在后台执行它并在完成后更新一个数据库
  • @GlynnHurrell 是免费的吗?
  • 是的,它 100% 免费。我相信开源

标签: c# jquery ajax asp.net-mvc asynchronous


【解决方案1】:

所以我创建了一个异步方法并使用 ajax 我能够触发它,因此希望用户可以在后台运行长进程时在不同的页面中做一些其他工作。

That's not what async is for.

你真正想要的是一个独立的后台工作者。 ASP.NET 通过处理 HTTP 请求来工作,并且您希望在 HTTP 请求之外完成一些工作(即,在 HTTP 请求完成之后)。因此,您想做的工作并不适合 ASP.NET。

我通常会针对这种情况推荐合适的分布式系统设计。这意味着添加一个可靠队列(Azure Queue / Amazon SQS / 等)和一个单独的后端处理器(Azure Function / Amazon Lambda / ASP.NET Core 后台服务 / Win32 服务 / 等)。然后 ASP.NET 处理程序将后台工作排入队列,并返回一个重定向;后端处理器将从队列中提取工作并实际执行。

Hangfire 是一种低门槛的解决方案;它使用数据库作为可靠队列并具有进程内后端处理器(类似于托管在 ASP.NET Core HTTP 应用程序中的 ASP.NET Core 后台服务)。这种方法有一些权衡(例如,您不能独立扩展后端),但如果您还没有使用 ASP.NET Core,这是一个不错的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2023-03-22
    相关资源
    最近更新 更多