ASP.NET MVC对于ajax.abort()的解决方法

3

我有一个基于asp.net mvc的rest端点:

[HttpGet]
public List<SomeEntity> Get(){
    // Lets imagine that this operation lasts for 1 minute
    var someSlowOperationResult = SomeWhere.GetDataSlow();
    return someSlowOperationResult;
}

在前端,我有一个下一个JavaScript:

var promise = $.get("/SomeEntities");
setTimeout(function(){promise.abort()}, 100);

如何在中止调用后强制终止线程,以防止进行缓慢的计算?谢谢。
2个回答

1
我发现Response有一个isClientConnected属性。因此,我们可以使用以下方法:
[HttpGet]
public List<SomeEntity> Get(){
        var gotResult = false;
        var result = new List<SomeEntity>();
        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;
        Task.Factory.StartNew(() =>
        {
            // Do something with cancelation token to break current operation
            result = SomeWhere.GetSomethingReallySlow();
            gotResult = true;
        }, ct);
        while (!gotResult)
        {
            if (!Response.IsClientConnected)
            {
                tokenSource2.Cancel();
                return result;
            }
            Thread.Sleep(100);
        }
        return result;
}

我错过了什么吗?我们可以吗?

更新:

是的,它有效。


即使我们在 ajax 调用上调用 abort() 方法,客户端仍然保持连接,因此 IsClientConnected 方法将返回 true。如果客户端重定向到另一页或关闭浏览器,则该方法将返回 false。 - Konstantin Dinev
@KonstantinD-Infragistics,但是服务器端如何知道客户端关闭了浏览器? ;) - Maris
@KonstantinD-Infragistics 刚刚测试了一下,你错了。它可以工作!如果我使用 promise.abort() 中止请求,我会到达后端的 tokenSource2.Cancel()。 - Maris

0
后端不知道您是否调用了abort(),如果请求已经发送,则服务器端逻辑将一直运行直到完成。为了阻止它继续运行,您需要向您的controller发送另一个请求,通知该控制器您已中止该请求,控制器将访问当前正在运行缓慢操作的实例,该实例应该有一个方法来强制取消计算。

我认为在低级别上,“中止”指的是关闭浏览器和服务器端之间的连接,因此必须找到处理它的方法。 - Maris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接