0

MVC 4 プロジェクトで Web サービス呼び出しの問題を解決しようとしています。私がやっていることは、ユーザーがページ上のフォームを送信すると、webservice を呼び出して結果を待つことです。その間、サーバーはコールバックを返します (サーバー側で完了した作業ステップを含む文字列を返します)。私がやりたいことは、コールバックから作成している「ログ」の内容をページに表示し、それを繰り返し更新して進行状況を表示することです。

私が遭遇する問題は、コントローラーで Web サービスの非同期呼び出しが発生することです。この場合、Web サービスからの結果を待っていないため、進行状況を表示する必要があるページにユーザーが留まらないことを意味します。同期的に呼び出します。この場合、ページ上の JavaScript は、最終的な応答が到着するまでコントローラーから応答を取得しません (したがって、更新は表示されません)。

私の希望の流れは次のとおりです。

  1. ユーザーがフォームを送信
  2. サーバーはコントローラーで呼び出されます
  3. サーバーはコールバックを送信し、コントローラーは到着したもので「ログ」変数を展開することによりそれらを処理します
  4. コントローラーがサーバーからの最終結果を待機している間、ユーザーには引き続き同じページが表示され、「ログ」(特定の div に含まれる) が JavaScript によって定期的に更新されます。
  5. サーバーが最終結果を返す
  6. コントローラーはコードを終了し、新しいビューを返します

これは私の投稿方法で、現在は応答を待たず、すぐに先に進みます:

[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