MVC 4 プロジェクトで Web サービス呼び出しの問題を解決しようとしています。私がやっていることは、ユーザーがページ上のフォームを送信すると、webservice を呼び出して結果を待つことです。その間、サーバーはコールバックを返します (サーバー側で完了した作業ステップを含む文字列を返します)。私がやりたいことは、コールバックから作成している「ログ」の内容をページに表示し、それを繰り返し更新して進行状況を表示することです。
私が遭遇する問題は、コントローラーで Web サービスの非同期呼び出しが発生することです。この場合、Web サービスからの結果を待っていないため、進行状況を表示する必要があるページにユーザーが留まらないことを意味します。同期的に呼び出します。この場合、ページ上の JavaScript は、最終的な応答が到着するまでコントローラーから応答を取得しません (したがって、更新は表示されません)。
私の希望の流れは次のとおりです。
- ユーザーがフォームを送信
- サーバーはコントローラーで呼び出されます
- サーバーはコールバックを送信し、コントローラーは到着したもので「ログ」変数を展開することによりそれらを処理します
- コントローラーがサーバーからの最終結果を待機している間、ユーザーには引き続き同じページが表示され、「ログ」(特定の div に含まれる) が JavaScript によって定期的に更新されます。
- サーバーが最終結果を返す
- コントローラーはコードを終了し、新しいビューを返します
これは私の投稿方法で、現在は応答を待たず、すぐに先に進みます:
[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: ページ コンテンツの更新以外の解決策も受け入れます。目標がどのように達成されるかはあまり気にしませんが、顧客はページを更新することを好みます。