0

我正在尝试解决我的 MVC 4 项目中的 web 服务调用问题。我正在做的是,当用户在页面上提交表单时,我调用 webservice 并等待结果。同时服务器返回回调(它返回包含服务器端已完成工作步骤的字符串)。我想做的是在页面上显示我从回调构建的“日志”的内容,并反复刷新它以显示进度。

我遇到的问题是,要么我将在我的控制器中异步调用 web 服务,在这种情况下,我不会等待 web 服务的结果,这意味着用户不会停留在应该显示进度的页面上,或者我会同步调用它,在这种情况下,页面上的 javascript 在最终响应到达之前不会从控制器获得响应(因此不会显示更新)。

我想要的流程是:

  1. 用户提交表单
  2. 在控制器中调用服务器
  3. 服务器发送回调,控制器通过扩展“日志”变量来处理它们
  4. 用户仍然看到相同的页面,其中“日志”(包含在特定 div 中)被 javascript 定期刷新,而控制器等待来自服务器的最终结果
  5. 服务器返回最终结果
  6. 控制器完成其代码并返回新视图

这是我的 post 方法,目前不等待响应并立即继续:

[HttpPost]
public async Task<ActionResult> SubmitDetails
               (DocuLiveInstallationRequest submittedRequest, string command)
{
    request = submittedRequest;
    try
    {
        switch (command)
        {
            case "Test":
                {
                    request.OnlyTest = true;
                    DocuLiveInstallationStatus installStatus 
                                                       = await IsValidStatus();
                    if (installStatus == null)
                    {
                        ViewBag.Fail = Resources.AppStart.TestNoResult;
                        return View("SubmitDetails", request); ;
                    }
                    else
                    {
                        status = installStatus;
                        if (status.Result)
                        {
                            ViewBag.Success = Resources.AppStart.TestSucces;
                            ViewBag.Log = installLog;
                        }
                        TempData["installationStatus"] = installStatus;
                        return View("SubmitDetails", request);
                    }
                }
            case "Submit":
                {
                    request.OnlyTest = false;
                    DocuLiveInstallationStatus installStatus = await Install();
                    if (installStatus == null)
                    {
                        ViewBag.Fail = Resources.AppStart.InstallationNoResult;
                        return View("SubmitDetails", request); ;
                    }
                    else
                    {
                        status = installStatus;
                        TempData["installationStatus"] = installStatus;
                        TempData["installLog"] = installLog;
                        return RedirectToAction("Login",controllerName:"Login");
                    }
                }
        }
        ViewBag.TestFail = Resources.AppStart.SubmitFailure;
        return View("SubmitDetails", request); ;
    }
    catch
    {
        return View();
    }
}

这是我为视图准备的 javascript:

<script type="text/javascript">
    $(document).ready(function () {
        //$("#submitDetails").click(function () {
            var progress = 0;
            //$("#submitDetails").attr('disabled', 'disabled');
            var statusUpdate = setInterval(function () {
                $.ajax({
                    type: 'GET',
                    url: "/AppStart/GetInstallProgress",
                    datatype: "application/html; charset=utf-8",
                    success: function (data) {
                        if (data && data != "") {
                            $("div.status-message").text(progress);
                        }
                    }
                });
            }, 2000);
        //});
    });
</script>

目前我只是在下一页显示日志(在开发服务器的这个阶段返回响应非常迅速),但我需要调用服务器,在等待结果时显示回调的进度,然后导航到另一个页面(取决于结果)。我觉得我很接近,但我无法让它工作。

PS:我对更新页面内容以外的其他解决方案持开放态度。我真的不介意如何实现目标,但客户更喜欢更新页面。

4

0 回答 0