接続は開いたままなので、サーバーは既存の接続を介して応答します。これには、応答にコールバックハンドラー名が含まれます。
クライアントはメッセージの形式を理解し、サーバー応答からのデータを使用して(コールバックハンドラーに基づいて)適切なローカルメソッドを呼び出すことができます。
私は通常ウィキペディアを引用したくないのですが、この場合、それは長いポーリングの悪い説明ではありません...
ロングポーリングは、従来のポーリング手法のバリエーションであり、サーバーからクライアントへの情報プッシュのエミュレーションを可能にします。長いポーリングでは、クライアントは通常のポーリングと同様の方法でサーバーに情報を要求します。ただし、サーバーにクライアントが利用できる情報がない場合、サーバーは空の応答を送信する代わりに、要求を保持し、いくつかの情報が利用可能になるのを待ちます。情報が利用可能になると(または適切なタイムアウトの後)、完全な応答がクライアントに送信されます。クライアントは通常、すぐにサーバーに情報を再要求するため、サーバーにはほとんどの場合、イベントに応答してデータを配信するために使用できる待機中の要求があります。Web / AJAXコンテキストでは、ロングポーリングはCometプログラミングとも呼ばれます。
明確化
- クライアントは、コールバックハンドルを含むPOSTをサーバーに送信し、接続を開いたままにします
- しばらくすると、サーバーはPOSTからのコールバックハンドルと応答データで応答します(これは、サーバーでのメソッドを呼び出すときに発生し
AsyncCallback
ます)
- クライアントはサーバーからの応答を読み取り、返されたコールバックハンドルを識別し、それを使用して実行するメソッドを識別します。
- クライアントは、コールバックハンドルで指定されたメソッドを実行し、残りのサーバー応答を渡します。
これは、JSONPの動作方法(コールバック部分、長いポーリングではない)に似ていますが、これに精通している場合はどうでしょうか。基本的に、コールバックハンドルはサーバーにのみ渡されるため、応答とともに返送され、クライアントは正しいメソッドを呼び出すことができます。
意図されたメソッドのみが呼び出され、悪意のあるサーバーがクライアントコードで選択したメソッドを実行できないことを確認するために、内部で追加のチェックが行われています。