सर्वर ने मानक asp.net mvc के साथ ईवेंट्स(इवेंटसॉर्स) भेजे, जिससे त्रुटि हुई



asp.net-mvc server-sent-events (1)

EventSource एक विशिष्ट प्रारूप की उम्मीद करता है , और यदि धारा उस प्रारूप से मेल नहीं खाती है तो ऑनरोर बढ़ाएगी - एक नई पंक्ति वर्ण में समाप्त होने वाली प्रत्येक पंक्ति के साथ : फ़ील्ड / मान युग्म की रेखाओं का एक सेट।

field: value
field: value

field data , event , id , रीट्री या टिप्पणी के लिए खाली में से एक हो सकता है (EventSource द्वारा अनदेखा किया जाएगा)।

data कई पंक्तियों को फैला सकता है, लेकिन उन पंक्तियों में से प्रत्येक को data: शुरू होना चाहिए data:

प्रत्येक ईवेंट ट्रिगर को एक डबल न्यूलाइन के साथ समाप्त होना है

data: 1
data: second line of message

data: 2
data: second line of second message

नोट: यदि आप VB.NET में लिख रहे हैं, तो आप newlines लिखने के लिए \n एस्केप अनुक्रम का उपयोग नहीं कर सकते हैं; आपको vbLf या Chr(10)

एक तरफ के रूप में, EventSource सर्वर के लिए एक खुला कनेक्शन रखने वाला है। MDN (जोर मेरा):

EventSource इंटरफ़ेस का उपयोग सर्वर-भेजे गए ईवेंट प्राप्त करने के लिए किया जाता है। यह HTTP पर सर्वर से जुड़ता है और कनेक्शन को बंद किए बिना टेक्स्ट / इवेंट-स्ट्रीम फॉर्मेट में ईवेंट प्राप्त करता है।

एक बार MVC कंट्रोलर विधि से नियंत्रण समाप्त हो जाने पर, परिणाम को पैक करके क्लाइंट को भेज दिया जाएगा, और कनेक्शन बंद कर दिया जाएगा। EventSource का हिस्सा यह है कि क्लाइंट कनेक्शन को फिर से खोलने की कोशिश करेगा, जो एक बार फिर सर्वर द्वारा तुरंत बंद कर दिया जाएगा; परिणामी करीब -> फिर से खोलना चक्र भी here देखा जा सकता here ।

विधि से बाहर निकलने के बजाय, विधि में कुछ प्रकार का लूप होना चाहिए जो Response स्ट्रीम को लगातार लिखता रहेगा।

VB.NET में उदाहरण

Imports System.Threading
Public Class HomeController
    Inherits Controller

    Sub Message()
        Response.ContentType= "text/event-stream"
        Dim i As Integer
        Do
            i += 1
            Response.Write("data: DateTime = " & Now & vbLf)
            Response.Write("data: Iteration = " & i & vbLf)
            Response.Write(vbLf)
            Response.Flush

            'The timing of data sent to the client is determined by the Sleep interval (and latency)
            Thread.Sleep(1000) 
        Loop
    End Sub
End Class

C # में उदाहरण

ग्राहक की ओर:

<input type="text" id="userid" placeholder="UserID" /><br />
<input type="button" id="ping" value="Ping" />

<script>
    var es = new EventSource('/home/message');
    es.onmessage = function (e) {
        console.log(e.data);
    };
    es.onerror = function () {
        console.log(arguments);
    };

    $(function () {
        $('#ping').on('click', function () {
            $.post('/home/ping', {
                UserID: $('#userid').val() || 0
            });
        });
    });
</script>

सर्वर साइड:

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Web.Mvc;
using Newtonsoft.Json;

namespace EventSourceTest2.Controllers {
    public class PingData {
        public int UserID { get; set; }
        public DateTime Date { get; set; } = DateTime.Now;
    }

    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }

        static ConcurrentQueue<PingData> pings = new ConcurrentQueue<PingData>();

        public void Ping(int userID) {
            pings.Enqueue(new PingData { UserID = userID });
        }

        public void Message() {
            Response.ContentType = "text/event-stream";
            do {
                PingData nextPing;
                if (pings.TryDequeue(out nextPing)) {
                    Response.Write("data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n");
                }
                Response.Flush();
                Thread.Sleep(1000);
            } while (true);
        }
    }
}

मैं सर्वर द्वारा भेजी जाने वाली घटनाओं में अपना हाथ आजमा रहा हूं, लेकिन मैं इसे एमवीसी परियोजना (वेबपीआई नहीं) के भीतर काम करने के लिए नहीं प्राप्त कर सकता। मुझे कोई अच्छा नमूना ऑनलाइन नहीं मिला है।

यह सर्वर-साइड कोड मैंने कोशिश की है (विभिन्न पदों से कई असफल प्रयासों सहित):

Function GetRows() as ActionResult
    Dim ret = New HttpResponseMessage
    ' ret.Content.w
    ' Return ret

    Response.ContentType = "text/event-stream"
    Response.Write("data: " & "aaaa")
    Dim flag = False
    If flag Then
        For i = 0 To 100
            Response.Write("data: " & i)
        Next
    End If
    Response.Flush()
    'Return Content("Abv")
    'Return Content(("data: {0}\n\n" & DateTime.Now.ToString(), "text/event-stream")
End Function

और यहाँ जावास्क्रिप्ट है

var source = new EventSource("/Tool/GetRows");
source.onmessage = function (event) {
    document.getElementById("messages").innerHTML += event.data + "<br>";
};
source.onerror = function (e) {
    console.log(e);
};

किसी कारण से यह हमेशा onerror रहा है, और वहाँ कोई जानकारी नहीं है कि यह किस प्रकार की त्रुटि हो सकती है।

मैं क्या गलत कर रहा हूं?

BTW, मुझे नहीं लगता कि यह कार्रवाई वास्तव में कुछ भी वापस आनी चाहिए, क्योंकि मेरी समझ यह है कि यह केवल स्ट्रिंग द्वारा स्ट्रिंग को लिखना चाहिए।





eventsource