繁体   English   中英

MVC4异步控制器操作未完成

[英]MVC4 Async Controller Action not completed

我有一个异步动作被jquery ajax请求调用:

视图:

$.ajax({
    url: "@Url.Action("StartVerification", "Devices")",
    global: false,
    data: JSON.stringify(machineIds),
    contentType: 'application/json',
    type: 'POST'
    ...

控制器:

[HttpPost]
[SessionExpireFilter(Order = 1)]
[CheckPermissions(Order = 2)]
[AjaxMessagesFilter(Order = 3)]
[AsyncTimeout(30000, Order = 4)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimeoutError", Order = 5)]
public async Task<JsonResult> StartVerification(ICollection<Machine> machines)
{
    Dictionary<int, bool> collection = new Dictionary<int, bool>();
    foreach (var machine in machines)
    {
        Response response = new Response();
        try
        {
            response = await this.deviceRepository.StartVerification(machine);
        }
        catch (Exception ex)
        {
            response.Success = false;
        }
        collection.Add(machine.MachineID, response.Success);
    }

    return this.Json(collection.ToDictionary(x => x.Key.ToString(), y => y.Value));
}

Web服务呼叫:

public async Task<Response> StartVerification(Machine machine, CancellationToken cancelToken = default(CancellationToken))
{
    WebService WebServiceForTask = WebServiceFactory.NewInstance;

    return await Task.Run(() => WebServiceForTask.StartVerificationForWebSite(machine.SiteID, machine.MachineID));
}

我遇到的问题是,当执行StartVerification操作时,该操作调用然后查询Web服务。 对于该结果的查询可能需要长达几秒钟的时间,在此期间,用户可以按下其浏览器的刷新按钮。 处理这种情况并中止通话等的最佳方法是什么?

编辑:也许我问的问题错了。 这里的问题是,当我StartVerification并单击刷新页面F5时,该页面将不会刷新,直到我收到来自Web服务的响应为止……并且看来Action不是异步运行的。 我希望它能够正常工作,以便如果已经调用了控制器操作并等待来自Web服务的响应,那么我仍然应该能够简单地浏览离开我从中调用操作的页面。

处理这种情况并简单地中止通话等的最佳方法是什么

您可以在启动AJAX请求之前订阅onbeforeunload事件:

window.onbeforeunload = function() {
    return 'There\'s an ongoing operation. If you leave this page you might lose some data';
};

并且当AJAX调用完成时,删除对此事件的订阅。

由于您具有AsyncTimeout属性,因此应采用一个代表该timeout的CancellationToken

还有另一个CancellationToken代表用户提前断开连接( Response.ClientDisconnectedToken )。 但是, 当前在ClientDisconnectedToken存在争用条件,因此不建议在当前版本的ASP.NET(4.5)中使用它。 现在最好的策略是兑现AsyncTimeout而忽略早期的客户端断开连接。

但是,如果您确实想检测客户端断开连接,则可以定期轮询Response.IsClientConnected

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM