Hi,
ich habe mir im Internet eine Methode gesucht um zu lernen wie man
ServerSendEvents also Dynamisches nachliefern von Daten realisieren
kann...
hierfür habe ich folgende C# Methode gefunden:
1 | private static BlockingCollection<string> _data = new BlockingCollection<string>();
|
2 |
|
3 | static HomeController()
|
4 | {
|
5 | _data.Add("started");
|
6 | for (int i = 0; i < 10; i++)
|
7 | {
|
8 | _data.Add("item" + i.ToString());
|
9 | }
|
10 | _data.Add("ended");
|
11 | }
|
12 |
|
13 | public ActionResult Message()
|
14 | {
|
15 | var result = string.Empty;
|
16 | var sb = new StringBuilder();
|
17 | if (_data.TryTake(out result, TimeSpan.FromMilliseconds(100)))
|
18 | {
|
19 | JavaScriptSerializer ser = new JavaScriptSerializer();
|
20 | var serializedObject = ser.Serialize(new { item = result, message = "hello" });
|
21 | sb.AppendFormat("data: {0}\n\n", serializedObject);
|
22 | }
|
23 | return Content(sb.ToString(), "text/event-stream");
|
24 | }
|
und dazu Passendes HTML
1 | <script>
|
2 | function contentLoaded() {
|
3 |
|
4 | var source = new EventSource('message');
|
5 | //var source = new EventSource('home/message');
|
6 | var ul = document.getElementById("messages");
|
7 |
|
8 |
|
9 | console.log(source);
|
10 |
|
11 | source.onmessage = function (e) {
|
12 |
|
13 |
|
14 |
|
15 | var li = document.createElement("li");
|
16 | /*
|
17 | var returnedItem = e.data
|
18 | */
|
19 |
|
20 | li.textContent = e.data; //returnedItem.message + ' ' + returnedItem.item;
|
21 |
|
22 | ul.appendChild(li);
|
23 | }
|
24 | }
|
25 |
|
26 | window.addEventListener("DOMContentLoaded", contentLoaded, false);
|
27 | </script>
|
28 |
|
29 | <ul id="messages"></ul>
|
soweit so gut...
nun sendet mir der Server alle 3 Sekunden eine Nachricht <- eben von den
10...
jetzt frag ich mich: "woher kommen die 3 Sekunden" und kann ich das
steuern?
So wie ich das verstehe, arbeitet das EventSource mit einer art
LongPolling, d.h. es wartet, wann neue Infos kommen...
=> ABER, ich kann nichts erkennen, was mit meine "Message()" aufruft
oder triggert!?
... mit einem Sleep kann ich das ganze verzögern, aber ich will das ja
beschleunigen, oder eben nur dann haben wenn auch Nachrichten kommen,
dafür aber INSTANT.
Wäre sehr Nett, wenn mir das jemand "erklären" kann ;)
danke vielmals
arni