質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

2323閲覧

asp:button 押下前にサーバサイドが応答しているか確認したいためPingのようなことを行いたい

syugaa_buresu

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2022/01/06 07:46

編集2022/01/10 23:36

前提・実現したいこと

画面遷移やサーバサイドに要求を投げる際に
サーバサイドが応答しているか事前確認を行いたい

最低 Web サーバーが生きていることを確認できれば良いが、できれば Web サーバーの後ろにある
DB サーバーまで生きていることを確認したい。それを ajax を使って非同期でやりたい

※javascriptコード内にあるbtnSecとasp.netのbtnSecは同じIDです。

該当のソースコード

javascript

1//各ボタン押下時イベント 2$("#btnSec").click(function () { 3if (onlineCheck()) { 4 return true; 5} else { 6 alert('ネットワーク異常発生!!\n管理者に確認してください'); 7 return false; 8} 9});

javascript

1/*オンラインか確認する*/ 2function onlineCheck() { 3 //Pingチェック 4 $.ajax({ 5 type: "Post", 6 async: false, 7 url: window.location.href + '/Ping', 8 contentType: 'application/json', 9 success: function (data) { 10 $('#lblNetWorkInfo').text(''); 11 result = true; 12 }, 13 error: function (data) { 14 $('#lblNetWorkInfo').text('ネットワークエラー'); 15 result = false; 16 } 17}); 18return result; 19}

C#

1<asp:Button ID="btnSec" runat="server" Text="反映" OnClick="ClickBtnSection" />

試したこと

・ajax同期通信で実施。想定通りの動きにはなるが画面がしばらく固まってしまうため避けたい

・タイムアウトを設定してやろうと考えたが同期通信ではタイムアウトが使えないため
非同期で作成。しかし非同期のため処理が先に行ってしまいボタンクリックイベントが終わってしまう

補足情報(FW/ツールのバージョンなど)

IE11 互換表示有
jquery1.8.3
asp.net webform

開発環境
visualstudio2015
.net Framework4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/06 08:15 編集

「サーバサイドが応答している」というのはどういうことですか? どういう要求に対してどういう応答が返ってくればその条件を満たすのですか? そもそも、初期画面が表示されたということはその時点で「サーバサイドが応答している」ということなので、そのうえさらに「asp:button 押下前にサーバサイドが応答しているか確認」というのがなぜ必要なの理解できないのですが?
syugaa_buresu

2022/01/06 08:24

「サーバサイドが応答している」というのはどういうことですか? どういう要求に対してどういう応答が返ってくればその条件を満たすのですか? → ajaxの要求を投げて帰っくればサーバサイドが応答しているとみなしています。 そもそも、初期画面が表示されたということはその時点で「サーバサイドが応答している」ということなので、そのうえさらに「asp:button 押下前にサーバサイドが応答しているか確認」というのがなぜ必要なの理解できないのですが? → こちらの画面は平たく言えばずっと表示をする画面で ある処理を一定周期で行っているのですがその際にサーバ側が落ちていた場合等で エラーになってしまうのを防ぐために事前に要求を投げて判断をしたい次第です。
退会済みユーザー

退会済みユーザー

2022/01/06 08:37

> ajaxの要求を投げて帰っくればサーバサイドが応答しているとみなしています。 Web サーバーが生きていることを確認できれば良いのですか? それとも Web サーバーの後ろにある DB サーバーまで生きていることを確認しなければならないとか?
syugaa_buresu

2022/01/06 08:40

→出来れば後者(DBサーバ)の方が嬉しいですが前者でも構いません。
退会済みユーザー

退会済みユーザー

2022/01/06 09:06

上のやり取りで明らかにされた要件「最低 Web サーバーが生きていることを確認できれば良いが、できれば Web サーバーの後ろにある DB サーバーまで生きていることを確認したい。それを ajax を使って非同期でやりたい」を質問欄を編集して追加情報として追記願います。
退会済みユーザー

退会済みユーザー

2022/01/06 22:50

ひょっとして $("#btnSec") と <asp:Button ID="btnSection" ... /> は同じボタンですか?
退会済みユーザー

退会済みユーザー

2022/01/07 02:24

質問者さん、その後無言ですが、回答しましたのでそれ対するフィードバックを返してください。役に立った/立たなかったぐらいならすぐ返事できるのでは? 役に立たなかったならどこがダメだったかを書くと、より期待するものに近い回答が出てくるかも。とにかく無言は NG です。 上のコメント、 > ひょっとして $("#btnSec") と <asp:Button ID="btnSection" ... /> は同じボタンですか? に対する答えが Yes ならその旨質問欄に追記してください。そうしてもらえればその対応は別途考えて回答欄に追記します。
dodox86

2022/01/07 03:09

@質問者さん ボタン押下前にサーバーの生死判定を行いたいのであれば、Ajaxの同期・非同期関係なしに判定結果を待機しなければならないでしょうから、UIが固まったようになるのは避けられない気がしますが。見た目、バックグラウンドで定周期でチェックするような処理が必要なのでは。
退会済みユーザー

退会済みユーザー

2022/01/08 03:01

dodox86 さん> > Ajaxの同期・非同期関係なしに判定結果を待機しなければならないでしょうから、UIが固まったようになるのは避けられない気がしますが。 質問者さんの言う「同期」とはたぶん質問の jQuery ajax のコードにある async: false, のことで、これを設定すると応答が返ってくるまでブラウザはフリーズしてしまいます。(jQuery の documantation から抜粋: "Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.") 一方、非同期(async はデフォルトで true)では、「固まったようになる」ことはないです。 なので、非同期 or 同期は、非同期の一択です。
syugaa_buresu

2022/01/10 23:27

失礼いたしました。回答が遅れてしまい申し訳ありません。 ひょっとして $("#btnSec") と <asp:Button ID="btnSection" ... /> は同じボタンですか? → そうです。人に公開できるよう修正してる部分でぬけがありました。同等とみて問題ありません。 SurferOnWwwさんの回答拝見いたしました。Ping確認に関してはそちらで問題なかったです。 ただasp.buttonなので非同期だと応答を待たずにreturnを行ってしまうので画面がリダイレクト?してしまいます。Ping確認後にサーバ側で処理を行う場合は同じくAjaxでやるしか手段はないのでしょうか? よろしくお願いいたします。
syugaa_buresu

2022/01/10 23:30

dodox86さん 一定周期でPing確認は考えておりませんでした。ありがとうございます。 参考にいたします。
退会済みユーザー

退会済みユーザー

2022/01/15 03:22

ポーリングしないで済む案を私の回答欄に追記したのですが 1/12 のメンテナンス(と言うより壊滅的な変更)で消えてしまいました。再度書く気力はなくしていたのですが、検証に使ったサンプルコードは自分の PC に残っていたのでそれをアップしておきます。
guest

回答2

0

今までボタン押下前にサーバ応答確認Ajaxを投げていましたが
それを一定周期にしHiddenにて値を保持することで
問題を解決することができました。
お二方のアドバイスでしたが回答してくださったSurferOnWwwさんをベストアンサーにいたします。
ありがとうございました。

投稿2022/01/11 01:31

syugaa_buresu

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/11 02:15

> それを一定周期にしHiddenにて値を保持することで その頻度やクライアントの数、そしてそれを受けてサーバー側で行う処置の内容によっては、サーバーに過大な負荷を強いるかもしれません。別の方法を後で回答欄に追記しておきます。
退会済みユーザー

退会済みユーザー

2022/01/15 03:20

上に「別の方法を後で回答欄に追記しておきます」と書いた通り追記したのですが 1/12 のメンテナンス(と言うより壊滅的な変更)で消えてしまいました。再度書く気力をなくしていたのですが、検証に使ったサンプルコードは自分の PC に残っていたのでそれをアップしておきます。
guest

0

最低 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 の場合:

イメージ説明

投稿2022/01/06 09:26

編集2022/01/15 08:33
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syugaa_buresu

2022/01/10 23:34

回答ありがとうございます。非同期Ajaxを投げてその後SELECTクエリ実行で 当初のPing確認は問題ありませんでした。 ただコメントのとおりasp:buttonのreturnが非同期ですのでAjaxの回答を待たずにTrueを返してリダイレクト?してしまう現象が発生してしまいました。
退会済みユーザー

退会済みユーザー

2022/01/11 01:46

asp:button は html に変換されてブラウザに送られると input type="submit" 要素になります。なので、それをクリックすると form が submit されます(即ち PostBack されます)。そのあたりの対応を後で上の回答欄に追記しておきます。
退会済みユーザー

退会済みユーザー

2022/01/15 03:21

上に「そのあたりの対応を後で上の回答欄に追記しておきます」と書いた通り追記したのですが 1/12 のメンテナンス(と言うより壊滅的な変更)で消えてしまいました。再度書く気力はなくしていたのですが、検証に使ったサンプルコードは自分の PC に残っていたのでそれをアップしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問