あなたは、私が説明する前に、コードのこの作品を書いたとき、どのようにあなたのタスク
を達成することができますアプローチを私はいただきました!間違って記述することから始めましょうあなたは、クライアントとサーバーが何らかの形で接続されていることを前提としていました。残念ながらそうではありません。 HTTPはステートレスプロトコルです。ステートレスなプロトコルは何を意味しているのでしょうか?
サーバーがJamesであり、彼に電話番号がない電話回線があるとします。彼は質問をする異なるクライアントから毎日千の電話を受ける。今やジェームズは非常に知識があり、すぐにそれらの質問に答えることができますが、クライアントから値引きを受けると、コールバックできません(発信者IDがないことを覚えていません。
質問は短いですが、答えを考えなければならない質問がある場合は、ジェームスが考えている間に待つか、ジェームスがあなたに電話して欲しい。
電話を待つためには、webconfigのASP.Net executionTimeOut値を増やす必要があります。デフォルト値は110秒であり、あなたが答えを待っている間、あなただけのボタン/リンクをクリックしたときに、関数を呼び出すHidePreloader
<div id="preloader" style="width: 100%; text-align: center;">
<img src="../Images/loading.gif" alt="" style="display: block;" />
</div>
<script language="javascript" type="text/javascript">
function HidePreloader() {
if (document.getElementById('preloader') != null) {
document.getElementById('preloader').style.visibility = 'hidden';
}
}
</script>
下のコードを使用して、スピナーのロード/進行状況を表示することができます。
これはすべてのおしゃれなドリーですが、ジェームスは古い人で、彼は同時に10の通話しか聞くことができないことを覚えています。 10人が既にジェームズに連れて行っているなら、彼は11回目のコールに答えることはできません。これは良いことではありません。私たちが望むのは、ジェームズが私たちに電話をかける方法です。私たちはJamesに発信者IDを与えたい。悲しいことに、発信者番号はWindows 8サーバーまで、そしてwebsocketsをサポートしているクライアント(ブラウザ)にのみ提供されます。
それでは、どうしたらこの問題を解決できますか?ああ、私たちがジェームズに名前をつけて教えれば、答えを見つけたかどうかを5分後に尋ねます。これはポーリングと呼ばれます。基本的には、サーバーに長期実行タスクを完了するように依頼し、サーバーはトークンを与えます。数分または数秒ごとに、あなたはサーバーに尋ねます。これは私のトークンです。私の仕事は完了しています。タスクが完了したら、ページに新しいデータを入力します。これは、従来、JavascriptとWebサービスを使用して実現されています。また、このフレームワークSignalIRを見て、このようなことを達成する方法を提供することもできます。
このメンタルモデルは、HTTPのステートレスな性質をよりよく理解するのに役立ちます。