C# 在重定向到其他页面时异步运行方法
我有一个asp.NETMVC应用程序,它使用J查询和Ajax。其中一个cshtml页面包含一个长时间运行的进程,因此我提出了一个异步方法,使用ajax我能够触发它,希望当长进程在后台运行时,用户可以在不同的页面上做一些其他工作 当我在同一页上工作时,它工作正常。但是当代码在后端运行时,我重定向到另一个页面时,我没有得到任何输出。当另一个方法正在运行时,是否无法重定向?如果是这样的话,我如何才能做到这一点 我的c#contollerC# 在重定向到其他页面时异步运行方法,c#,jquery,ajax,asp.net-mvc,asynchronous,C#,Jquery,Ajax,Asp.net Mvc,Asynchronous,我有一个asp.NETMVC应用程序,它使用J查询和Ajax。其中一个cshtml页面包含一个长时间运行的进程,因此我提出了一个异步方法,使用ajax我能够触发它,希望当长进程在后台运行时,用户可以在不同的页面上做一些其他工作 当我在同一页上工作时,它工作正常。但是当代码在后端运行时,我重定向到另一个页面时,我没有得到任何输出。当另一个方法正在运行时,是否无法重定向?如果是这样的话,我如何才能做到这一点 我的c#contoller public async System.Threading.Ta
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触发它,希望用户可以在后台运行长流程时在不同的页面中执行其他工作
你真正想要的是一个独立的背景工作者。ASP.NET通过处理HTTP请求来工作,您希望在HTTP请求之外完成一些工作(即,在HTTP请求完成之后)。因此,您想做的工作并不适合ASP.NET
对于这种情况,我通常推荐一种合适的分布式系统设计。这意味着添加一个可靠队列(Azure队列/Amazon SQS/etc)和一个单独的后端处理器(Azure函数/Amazon Lambda/ASP.NET核心后台服务/Win32服务/etc)。然后ASP.NET处理程序将要执行的后台工作排入队列,并返回重定向;后端处理器将从队列中提取工作并实际执行它
Hangfire是一种低入口解决方案;它使用数据库作为可靠队列,并具有进程内后端处理器(类似于ASP.NET Core HTTP应用程序中托管的ASP.NET Core后台服务)。这种方法有一些折衷之处(例如,您不能独立扩展后端),但如果您还没有使用ASP.NET Core,它是一个不错的解决方案
因此,我制作了一个异步方法,并使用ajax触发它,希望用户可以在后台运行长流程时在不同的页面中执行其他工作
你真正想要的是一个独立的背景工作者。ASP.NET通过处理HTTP请求来工作,您希望在HTTP请求之外完成一些工作(即,在HTTP请求完成之后)。因此,您想做的工作并不适合ASP.NET
对于这种情况,我通常推荐一种合适的分布式系统设计。这意味着添加一个可靠队列(Azure队列/Amazon SQS/etc)和一个单独的后端处理器(Azure函数/Amazon Lambda/ASP.NET核心后台服务/Win32服务/etc)。然后ASP.NET处理程序将要执行的后台工作排入队列,并返回重定向;后端处理器将从队列中提取工作并实际执行它
Hangfire是一种低入口解决方案;它使用数据库作为可靠队列,并具有进程内后端处理器(类似于ASP.NET Core HTTP应用程序中托管的ASP.NET Core后台服务)。这种方法有一些折衷之处(例如,您无法独立扩展后端),但如果您还没有使用ASP.NET Core,这是一个不错的解决方案。重定向到另一个页面将中止任何正在进行的请求。当前页面中的所有脚本也将消失,因此永远不会调用
success
。我如何才能做到这一点?任何解决方法都会很有帮助,看看如何使用或类似。正如@charlietfl所说,请求在页面退出时结束。如果您有一个长时间运行的任务,您可以让Hangfire在后台执行,并在需要时更新数据库done@GlynnHurrell是免费的吗?是的,100%免费。开源我相信重定向到另一个页面将中止任何正在进行的请求。当前页面中的所有脚本也将消失,因此永远不会调用success
。我如何才能做到这一点?任何解决方法都会很有帮助,看看如何使用或类似。正如@charlietfl所说,请求在页面退出时结束。如果您有一个长时间运行的任务,您可以让Hangfire在后台执行,并在需要时更新数据库done@GlynnHurrell是免费的吗?是的,100%免费。我相信开源
$('#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;
});