Le mieux je pense est à l'aide de la Comète.
Dans la Comète de style applications, le serveur peut essentiellement à envoyer des données au client (au lieu de la demande du client, des données à partir du serveur, encore et encore.). Le client doit uniquement se connecter à un serveur une fois. et puis serveur va continuer à pousser données vers le client.
De Wikipedia:
La comète est une technique de programmation qui permet aux serveurs web pour envoyer des données au client sans avoir besoin pour le client d'en faire la demande. Il permet de créer des event-driven web applications qui sont hébergées dans le navigateur.
Et maintenant, nous allons voir comment la Comète œuvres. Voir la suite le code côté serveur. ici, un while
boucle est utilisée, vous pouvez définir votre propre condition. Dans la boucle while, la page écrit un datetime et les bouffées de chaleur et puis dort pendant 1/2 secondes.
ASP.NET la page code-behind: le Service.aspx.cs
public static string Delimiter = "|";
protected void Page_Load(object sender, EventArgs e)
{
Response.Buffer = false;
while (true)
{
Response.Write(Delimiter
+ DateTime.Now.ToString("HH:mm:ss.FFF"));
Response.Flush();
// Suspend the thread for 1/2 a second
System.Threading.Thread.Sleep(500);
}
// Yes I know we'll never get here,
// it's just hard not to include it!
Response.End();
}
Côté Client code JavaScript
Seulement en faire la demande une fois, et puis garder le contrôle des données dans l' readyState === 3
de XMLHttpRequest
.
function getData()
{
loadXMLDoc("Service.aspx");
}
var req = false;
function createRequest() {
req = new XMLHttpRequest(); // http://msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx
}
function loadXMLDoc(url) {
try {
if (req) { req.abort(); req = false; }
createRequest();
if (req) {
req.onreadystatechange = processReqChange;
req.open("GET", url, true);
req.send("");
}
else { alert('unable to create request'); }
}
catch (e) { alert(e.message); }
}
function processReqChange() {
if (req.readyState == 3) {
try {
ProcessInput(req.responseText);
// At some (artibrary) length recycle the connection
if (req.responseText.length > 3000) { lastDelimiterPosition = -1; getData(); }
}
catch (e) { alert(e.message); }
}
}
var lastDelimiterPosition = -1;
function ProcessInput(input) {
// Make a copy of the input
var text = input;
// Search for the last instance of the delimiter
var nextDelimiter = text.indexOf('|', lastDelimiterPosition + 1);
if (nextDelimiter != -1) {
// Pull out the latest message
var timeStamp = text.substring(nextDelimiter + 1);
if (timeStamp.length > 0) {
lastDelimiterPosition = nextDelimiter;
document.getElementById('outputZone').innerHTML = timeStamp;
}
}
}
window.onload = function () { getData(); };
Référence