ASP.NETでMVCフレームワークを使用してサーバーコードを記述しています。私のクライアントコードはjavascriptです。サーバーサイドのAJAX呼び出しタイムアウトを制御する方法
ブラウザからサーバーにAJAXリクエストを送信するためにJQueryを使用するかどうかに関係なく、タイムアウトを設定できます。もちろん、ブラウザにはタイムアウトが設定されています。いずれかのタイムアウトに達すると、ajax呼び出しの失敗メソッドが呼び出され、引数の1つがタイムアウトを指定します。
私は最近、サーバーがAJAX呼び出しをタイムアウトさせ、500エラーコードで終了することを発見しました。クライアントは500エラーコードとして受信し、予期しないエラーはありません。しかし、この場合、基盤となるサーバーワーカープロセスは続行されます。つまり、ワーカーが知っていることを知らずに500エラーコードを割り込んで送信するのは、Webサーバー自体(IISの場合)だけです。そのため、ワーカーは、問題があります。
一方、AJAX呼び出しのエラーハンドラのクライアントは、500のステータスを取得します。これは、ワーカープロセスの失敗と解釈されることがあります。処理されない例外と致命的な終了が考えられます。私が見る限り、クライアントが予期せぬ例外とは別に問題がタイムアウトであったことを知る方法はありません。したがって、実際には非常に生きているときに、クライアントコードが誤ってワーカープロセスが停止していると想定する可能性があります。
ので....三重質問:
- は、サーバーのタイムアウト設定を制御するために、MVC ASP.NETでの方法はありますか?
- サーバがタイムアウトを生成した場合に通知するには時間がかかりすぎると思うワーカープロセスのための方法はありますか?
- ワーカーが予期しないエラーが発生したためではなく、ラッピングサーバーコードが長すぎると判断したため、この特定の500エラーが発生していないことをクライアント側のAJAXエラーコールバックで知る方法はありますか?
w.r.t. #3、AjaxレスポンスのresponseTextプロパティにレンダリングされた場合、タイムアウトがあったことをユーザーに知らせるhtmlが含まれていることがわかりますが、プログラムで解析すると本当に乱雑で信頼できないようです。
他の人がこれにぶつかる?
ADD/EDIT、1月26日の午後4時PDT:すぐに私はthis articleで解決策を見つけるかもしれないことを示唆している以下のコメントをもとに
、私が提案し、フィルタを実装しました。うまく行かなかった。私は明示的にワーカープロセスから未処理のタイムアウト例外をスローすることによって新しいフィルタをトリガすることができたので、他のSOの記事のフィルタは明らかに有効でしたが、トリガされませんでした。
このアプリケーションは、Windows Azure Webサイトとして実行していることを追加する必要があります。事実上の証拠/データから、VM上のIIS自体がリクエストを中断し、潜在的なワーカープロセスまたはMVCアプリにそれを一旦終了したと言っていなくても500エラーで応答していることを蓄積できたと私は信じています。要求。
これは、特定のWebサイトの特定のVMでIISを設定できるというITの問題のように思えるでしょう。
私のデータから、IISは230秒後に要求をキャンセルしているようです。
をし、その中に 'TimeoutException'を扱いますか?あまりにも長い実行中のプロセスかもしれませんが、私はhangfire.ioやsignalRのようなバックグラウンドジョブを使ってサーバからクライアントをトリガすることを提案しています – Developer
つまり、TimeoutExceptionを処理してhttp応答ステータスを変換するグローバルフィルタがあります。コードとメッセージをあなたの望むコードのmdメッセージ – Developer
@Developer - 私はこのグローバルフィルタについて何を意味するのかよく分かりません。私はそれが要求を終了しているIISであると信じています。あなたがより具体的な指示を持っているか、私がこれを試してみたいと思う場所にリンクすることができます。 –