Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在异步操作期间使用JS更新页面内容_C#_Javascript_Web Services_Asp.net Mvc 4_Async Await - Fatal编程技术网

C# 在异步操作期间使用JS更新页面内容

C# 在异步操作期间使用JS更新页面内容,c#,javascript,web-services,asp.net-mvc-4,async-await,C#,Javascript,Web Services,Asp.net Mvc 4,Async Await,我试图解决MVC4项目中webservice调用的一个问题。我所做的是,当用户提交页面上的表单时,我调用webservice并等待结果。同时,服务器返回回调(它返回包含服务器端已完成的工作步骤的字符串)。我想做的是在页面上显示通过回调生成的“日志”的内容,并反复刷新以显示进度 我遇到的问题是,要么我将在控制器中异步调用webservice,在这种情况下,我不会等待webservice的结果,这意味着用户不会停留在应该显示进度的页面上,要么我将同步调用它,在这种情况下,页面上的javascript

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

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

我希望的流程是:

  • 用户提交表单
  • 在控制器中调用服务器
  • 服务器发送回调,控制器通过扩展“log”变量来处理回调
  • 用户仍然可以看到相同的页面,其中“日志”(包含在特定的div中)由javascript定期刷新,而控制器等待来自服务器的最终结果
  • 服务器返回最终结果
  • 控制器完成其代码并返回新视图
  • 这是我的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();
        }
    }
    
    [HttpPost]
    公共异步任务提交详细信息
    (DocuLiveInstallationRequest submittedRequest,string命令)
    {
    请求=提交的请求;
    尝试
    {
    开关(命令)
    {
    案例“测试”:
    {
    request.OnlyTest=true;
    DocuLiveInstallationStatus安装状态
    =等待IsValidStatus();
    if(installStatus==null)
    {
    ViewBag.Fail=Resources.AppStart.TestNoResult;
    返回视图(“提交细节”,请求);
    }
    其他的
    {
    状态=安装状态;
    if(status.Result)
    {
    ViewBag.Success=Resources.AppStart.testsuccess;
    ViewBag.Log=installLog;
    }
    TempData[“installationStatus”]=installStatus;
    返回视图(“提交细节”,请求);
    }
    }
    案例“提交”:
    {
    request.OnlyTest=false;
    DocuLiveInstallationStatus installStatus=等待安装();
    if(installStatus==null)
    {
    ViewBag.Fail=Resources.AppStart.InstallationNoResult;
    返回视图(“提交细节”,请求);
    }
    其他的
    {
    状态=安装状态;
    TempData[“installationStatus”]=installStatus;
    TempData[“installLog”]=installLog;
    返回重定向操作(“登录”,控制器名称:“登录”);
    }
    }
    }
    ViewBag.TestFail=Resources.AppStart.submitfail;
    返回视图(“提交细节”,请求);
    }
    抓住
    {
    返回视图();
    }
    }
    
    这是我为视图准备的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>
    
    
    $(文档).ready(函数(){
    //$(“#提交详细信息”)。单击(函数(){
    var进程=0;
    //$(“#提交细节”).attr('disabled','disabled');
    var statusUpdate=setInterval(函数(){
    $.ajax({
    键入:“GET”,
    url:“/AppStart/GetInstallProgress”,
    数据类型:“应用程序/html;字符集=utf-8”,
    成功:功能(数据){
    如果(数据和数据!=“”){
    $(“div.status-message”)。文本(进度);
    }
    }
    });
    }, 2000);
    //});
    });
    
    目前,我只是在下一页显示日志(在开发的这个阶段,服务器会很快返回响应),但我需要调用服务器,在等待结果时显示回调的进度,然后导航到另一页(取决于结果)。我觉得我很接近,但我无法让它工作


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

    如果需要服务器提供多个响应,则需要拨打多个电话。异步是每一端处理其工作的方式。客户端发出调用并返回以不阻止UI,并在响应到达时收到通知。服务器返回到请求处理池,并在向客户端发送响应的工作完成时收到通知。我在这里遗漏了什么吗?我实际上是在使用服务器的回调来解决这个问题。所以,当进行调用时,UI不再被阻塞,而是服务器发送回由控制器处理的回调。我需要做的是定期(即每2秒)检查处理的进展情况,并使用Javascript在视图中显示它。这无法像我尝试的那样完成-在服务器返回响应之前,我无法从“外部”(通过JS)访问控制器-调用正在等待服务器响应-当它响应时,我不再需要JS更新。