Comment implémenter des données en temps réel pour une page Web
(C'est un Q/A question style, destiné à être une ressource pour les personnes qui demandent des questions similaires. Beaucoup de gens semblent buter sur la meilleure façon de le faire parce qu'ils ne les connais pas toutes les options. La plupart des réponses seront ASP.NET spécifiques, mais AJAX et d'autres techniques ont des équivalents dans d'autres cadres, tels que socket.io et SignalR.)
J'ai un tableau de données que j'ai mis en œuvre dans ASP.NET. Je veux afficher les modifications à la présente sous-jacent données sur la page en temps réel ou en temps quasi-réel. Comment dois-je faire?
Mon Modèle:
public class BoardGame
{
public int Id { get; set;}
public string Name { get; set;}
public string Description { get; set;}
public int Quantity { get; set;}
public double Price { get; set;}
public BoardGame() { }
public BoardGame(int id, string name, string description, int quantity, double price)
{
Id=id;
Name=name;
Description=description;
Quantity=quantity;
Price=price;
}
}
En lieu et place d'une base de données pour cet exemple, je vais juste à stocker les données dans la variable d'Application. Je vais à la graine dans mon Application_Start
fonction de mon Global.asax.cs.
var SeedData = new List<BoardGame>(){
new BoardGame(1, "Monopoly","Make your opponents go bankrupt!", 76, 15),
new BoardGame(2, "Life", "Win at the game of life.", 55, 13),
new BoardGame(3, "Candyland", "Make it through gumdrop forrest.", 97, 11)
};
Application["BoardGameDatabase"] = SeedData;
Si je ont été à l'aide de Formulaires Web, j'aimerais afficher les données avec un répéteur.
<h1>Board Games</h1>
<asp:Repeater runat="server" ID="BoardGameRepeater" ItemType="RealTimeDemo.Models.BoardGame">
<HeaderTemplate>
<table border="1">
<tr>
<th>Id</th>
<th>Name</th>
<th>Description</th>
<th>Quantity</th>
<th>Price</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#: Item.Id %></td>
<td><%#: Item.Name %></td>
<td><%#: Item.Description %></td>
<td><%#: Item.Quantity %></td>
<td><%#: Item.Price %></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
Et de charger les données dans le code behind:
protected void Page_Load(object sender, EventArgs e)
{
BoardGameRepeater.DataSource = Application["BoardGameDatabase"];
BoardGameRepeater.DataBind();
}
Si c'était MVC à l'aide d'un Rasoir, c'est juste un simple foreach sur le modèle:
@model IEnumerable<RealTimeDemo.Models.BoardGame>
<h1>Board Games</h1>
<table border="1">
<tr>
<th>
@Html.DisplayNameFor(model => model.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Quantity)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Quantity)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
</tr>
}
</table>
Nous allons utiliser des Formulaires Web pour avoir un peu la page pour ajouter des données de sorte que nous pouvons regarder la mise à jour des données en temps réel. Je vous recommande de créer deux fenêtres de navigateur de sorte que vous pouvez voir la forme et la table en même temps.
<h1>Create</h1>
<asp:Label runat="server" ID="Status_Lbl" /><br />
Id: <asp:TextBox runat="server" ID="Id_Tb" /><br />
Name: <asp:TextBox runat="server" ID="Name_Tb" /><br />
Description: <asp:TextBox runat="server" ID="Description_Tb" /><br />
Quantity: <asp:TextBox runat="server" ID="Quantity_Tb" /><br />
Price: <asp:TextBox runat="server" ID="Price_Tb" /><br />
<asp:Button runat="server" ID="SubmitBtn" OnClick="SubmitBtn_Click" Text="Submit" />
Et le code-behind:
protected void SubmitBtn_Click(object sender, EventArgs e)
{
var game = new BoardGame();
game.Id = Int32.Parse(Id_Tb.Text);
game.Name = Name_Tb.Text;
game.Description = Description_Tb.Text;
game.Quantity = Int32.Parse(Quantity_Tb.Text);
game.Price = Int32.Parse(Price_Tb.Text);
var db = (List<BoardGame>)Application["BoardGameDatabase"];
db.Add(game);
Application["BoardGameDatabase"] = db;
//only for SignalR
/*var context = GlobalHost.ConnectionManager.GetHubContext<GameHub>();
context.Clients.All.addGame(game); */
}
source d'informationauteur mason
Vous devez vous connecter pour publier un commentaire.
SignalR
C'est la réponse que je suis le plus heureux de le partager, parce qu'il représente un beaucoup plus propre mise en œuvre, qui est léger et fonctionne bien aujourd'hui dans le mobile de données (comprimé) de l'environnement.
Il y a eu plusieurs méthodes au fil des ans afin de fournir "en temps réel" en poussant de données à partir du serveur vers le client (ou l'apparition de l'envoi de données). Rapide Interrogation Court (semblable à mon AJAX basé sur les réponses), Le Temps D'InterrogationForever CadreServeur A Envoyé Des Événementset Les WebSockets sont différents mécanismes de transport utilisés à cette fin. SignalR est une couche d'abstraction capable de choisi le bon mécanisme de transport basé sur le client et le serveur. La meilleure partie de SignalR est que c'est simple. Vous n'avez pas à vous soucier de le mécanisme de transport, et le modèle de programmation est facile à comprendre.
Je vais définir un SignalR hub, mais il suffit de laisser vide.
Quand j'ai ajouter des données à la "base de données", je vais courir le morceau de code ci-dessous. Si vous lisez la question, vous verrez que je l'a mentionné dans la section "créer". Vous aurez envie de décommenter la.
Voici mon code de la page:
Et le code-behind:
Avis ce qui se passe ici. Lorsque le serveur d'appels
context.Clients.All.addGame(game);
c'est l'exécution de la fonction qui a été assignée àhub.client.addGame
pour chaque client qui est connecté à la GameHub. SignalR est de prendre soin de câblage des événements pour moi, et en les convertissant automatiquement mongame
objet sur le serveur de lagame
objet sur le client. Et le meilleur de tous, il n'y a aucun trafic réseau et en arrière de quelques secondes, il est donc incroyablement léger.Avantages:
Note, vous pouvez ajouter une fonction sur le client pour
editedGame
pour pousser changé de données sur le client facilement (même pour les supprimer).Minuterie/UpdatePanel
Si vous utilisez des Formulaires Web, vous pouvez utiliser un contrôle appelé un UpdatePanel. L'UpdatePanel est capable de rafraîchir les sections de la page de façon asynchrone, sans provoquer une publication de l'intégralité de la page. Combiné avec un asp:Minuterie, vous pouvez avoir le tableau de mise à jour aussi souvent que vous le souhaitez. Voici le code:
Et le code-behind:
Donc, nous allons parler de la façon dont celui-ci fonctionne. Toutes les 5 secondes, le compteur va lancer un événement Tick. Cela est enregistré comme une publication asynchrone serveur avec l'UpdatePanel, donc une publication partielle se produit, l'ensemble du cycle de vie de page fonctionne à nouveau, de sorte qu'il recharge les données sur le Chargement de la Page de l'événement, puis la totalité du contenu de l'UpdatePanel contenu du modèle est remplacé par fraîchement généré des données à partir du serveur. Regardons comment le réseau du trafic:
Avantages:
Inconvénients:
AJAX d'Interrogation, une meilleure mise en œuvre
Semblable à l'autre basé sur AJAX réponse, vous pouvez toujours interroger le serveur. Mais cette fois, au lieu de répondre avec les données à afficher, nous allons répondre avec une liste des ID des données. Le côté client va garder une trace des données déjà récupérées dans un tableau, puis il va faire un autre requête GET au serveur de données lorsqu'il voit un nouveau code a été ajouté.
Voici notre code de la page:
Voici les Web API Contrôleur:
Maintenant, c'est une bien meilleure mise en œuvre que mes autres AJAX basé sur la réponse et la Minuterie/UpdatePanel réponse. Puisque nous ne sommes qu'à l'envoi de l'ID à travers toutes les 5 secondes, c'est beaucoup plus légère pression sur les ressources réseau. Il faudrait aussi être assez trivial pour gérer absence de connexion au réseau, ou à exécuter une sorte de notification lorsque de nouvelles données ont été chargées, comme lancer un noty.
Avantages
Inconvénients
- Nous sommes toujours en interrogation, en générant une demande toutes les quelques secondes. Si les données ne changent pas très souvent, vous êtes inutilement à l'aide de la bande passante.
AJAX d'Interrogation, une mauvaise mise en œuvre
Si vous êtes en utilisant MVC ou des Formulaires Web, vous pouvez mettre en œuvre une technique appelée AJAX d'interrogation. Ce sera constamment envoyer une requête AJAX vers le serveur. Le serveur envoie une réponse contenant les données les plus récentes. Il est incroyablement simple à mettre en œuvre. Vous n'avez pas à utiliser jQuery d'utiliser AJAX, mais cela rend les choses beaucoup plus facile. Cet exemple va utiliser Web API pour le côté serveur de la fonctionnalité. L'API Web est similaire à la MVC, il utilise le routage et les contrôleurs pour traiter les demandes. C'est le remplacement de Services Web ASMX.
C'est le code web forms, mais c'est très similaire à la MVC code donc je vais omettre que:
C'est de faire une demande pour une API Web. L'API est de retour d'une représentation JSON de tous les jeux.
Le résultat global de cette méthode est similaire à la Minuterie/UpdatePanel méthode. Mais il ne doit pas envoyer de l'état d'affichage de données à la demande, et il n'a pas d'exécuter une longue page de cycle de vie du processus. Vous aussi vous n'avez pas de danse autour de détecter si vous êtes dans une publication ou pas, ou si vous êtes dans une publication partielle ou pas. Donc, je considère cela comme une amélioration par rapport à Minuterie/UpdatePanel.
Cependant, cette méthode a toujours l'un des inconvénients majeurs de la Minuterie/UpdatePanel méthode. Vous êtes toujours à l'envoi de toutes les données sur le fil avec chaque requête AJAX. Si vous regardez mes autres AJAX basé sur la réponse, vous aurez une meilleure manière de mettre en oeuvre AJAX d'interrogation.
Avantages
Inconvénients