最低 Web サーバーが生きていることを確認できれば良いが、できれば Web サーバーの後ろにある
DB サーバーまで生きていることを確認したい。それを ajax を使って非同期でやりたい
サーバーにある Web アプリに手を加えることが可能ならば、その確認のための要求を受け応答を返す Web サービスとか HTTP ジェネリックハンドラを追加してはいかがですか。
要求を受けたら例えば "生きてます" という応答を返す(DB サーバの生存確認も必要なら SELECT クエリを投げてその応答を確認するとかしてから)ようにしておき、その url を ajax を使って非同期で呼び出して "生きてます" という応答を確認して生存を確認するとか。
いつまで経っても応答が返ってこない場合が問題ですが、タイムアウトの処理は考えておられるそうですので、そのあたりは問題ないですよね?
2022/1/15 追記
ポーリングしないで済む案を私の回答欄に追記したのですが 1/12 のメンテナンス(と言うより破壊的な変更)で消えてしまいました。再度書く気力はなくしていたのですが、検証に使ったサンプルコードは自分の PC に残っていたのでそれをアップしておきます。
質問者さんの案のようにポーリングすると、その頻度やクライアントの数、そしてそれを受けてサーバー側で行う処置の内容によっては、サーバーに過大な負荷を強いるかもしれません。
asp:button は html に変換されてブラウザに送られると input type="submit" 要素になります。なので、それをクリックすると form が submit されます(即ち PostBack されます)。結果、質問に書いてある「非同期のため処理が先に行ってしまいボタンクリックイベントが終わってしまう」ということになります。
なので、その対応として、クリックしても submit などは起こらない input type="button" のボタンを追加し、それの click イベントで jQuery.ajax でサーバーに要求をかけ、期待する応答が返ってきたらクライアント側のスクリプトで asp:button をクリックするのが良いと思います。
ユーザーに asp:button をクリックされたくなければ CSS で非表示にしてください。
上記が期待通り動くかを検証したサンプルコードを以下に載せておきます。
.aspx
timeout: 5000 と設定して下にコードを載せた HTTP ジェネリックハンドラ Handler1.ashx を呼び出しています。Handler1.ashx は 3 秒待って応答を返すので done の function が実行され、それにより asp:button がクリックされます。 timeout: 2000 にすると fail になります。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
Inherits="WebForms1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="Scripts/jquery-3.4.1.js"></script>
<script type="text/javascript">
$(function () {
$("#btnSec").on("click", function () {
$.ajax({
type: "get",
url: "Handler1.ashx",
timeout: 5000
}).done(function (data) {
if (data == "生きてます") {
var hiddenbutton = document.getElementById("Button1");
hiddenbutton.click();
}
}).fail(function () {
$("#Label1").text("タイムアウトまたはサーバーエラー");
});
});
});
</script>
<style type="text/css">
.style1
{
display: none;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="btnSec" type="button" value="反映" />
<asp:Button ID="Button1" runat="server"
OnClick="ClickBtnSection" CssClass="style1" />
<asp:Label ID="Label1" runat="server" Text="Label1 初期値"></asp:Label>
</div>
</form>
</body>
</html>
.aspx.cs
using System;
namespace WebForms1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void ClickBtnSection(object sender, EventArgs e)
{
Label1.Text = "Button1 がクリックされました";
}
}
}
Handler1.ashx (下のコードは Handler1.ashx.cs のもの)
要求を受けると 3 秒待って "生きてます" という応答を返します。実際は本番の asp:button クリックで期待されるサーバー側での操作ができるかを検証してその成否を応答として返すようにするのが良いと思います。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebForms1
{
/// <summary>
/// Handler1 の概要の説明です
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
System.Threading.Thread.Sleep(3000);
context.Response.ContentType = "text/plain";
context.Response.Write("生きてます");
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
上のコードの実行して[反映]ボタンをクリックした結果は、timeout: 5000 の場合:
timeout: 2000 の場合: