Сервер отправил события + Asp Core, почему я не могу заставить его работать? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь SSE просто посмотреть, как они работают, но я не могу понять, почему этот код не работает. Я получаю ошибку клиента. В моем asp контроллере:

public class Example {
    public Example() {
        X = "12";
        Y = 5;
    }

    public string X { get; set; }
    public int Y { get; set; }
}

public IActionResult Index() {
    return View();
}

public async Task Messaggio() {
    Response.Headers.Add("Content-Type", "text/event-stream");
    var msg = System.Text.Json.JsonSerializer.Serialize(new Example());
    var bytes = Encoding.ASCII.GetBytes(msg);
    await Response.Body.WriteAsync(bytes, 0, bytes.Length);
    await Response.Body.FlushAsync();
    Response.Body.Close();
}

Сгенерировано на стороне клиента html:

<html><head>
    <script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
</head>
<body>

ciaoooo
<div id="Messaggio"></div>

<script>
    source = new EventSource('/Home/Messaggio');
    source.onopen = function (ddd) {
        console.log("aperta");
    };
    source.onerror = function (ddd) {
        console.log("errore");
        console.log(ddd.data);
        source.close();
    };

    source.onmessage = function (ddd) {
        $("#Messaggio").text(ddd.data);
        console.log(ddd.data);
    };
</script>

</body>
</html>

Вывод на консоль браузера:

aperta
errore
undefined

маршруты в порядке, потому что если я запрашиваю / home / messaggio, он работает, я получаю файл Json

Спасибо всем, кто может мне помочь.

1 Ответ

0 голосов
/ 13 апреля 2020

Вы не добавили атрибут "data" перед возвращенным "msg", поэтому вы не можете получить значение ddd.data в js.

Изменить Messaggio Действуйте следующим образом:

 public async Task Messaggio()
    { 
        Response.Headers.Add("Content-Type", "text/event-stream");
        var msg = System.Text.Json.JsonSerializer.Serialize(new Example());
        var bytes = Encoding.ASCII.GetBytes($"data: {msg}\n\n");
        await Response.Body.WriteAsync(bytes, 0, bytes.Length);
        await HttpContext.Response.Body.FlushAsync();
        Response.Body.Close(); 
    }

Вот результат:

enter image description here

...