'Server side events' 用 ASP Web 发送 Api 没有到达?

'Server side events' send with the ASP Web Api do not arrive?

我创建了一个测试源,它应该每隔 x 次向客户端发送一条消息。这是 ApiController:

public class TestSourceController : ApiController
{
    private static readonly ConcurrentQueue<StreamWriter> ConnectedClients = new ConcurrentQueue<StreamWriter>();

    [AllowAnonymous]
    [Route("api/sources/test")]
    public HttpResponseMessage Get()
    {
        var response = Request.CreateResponse();
        response.Content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>) OnStreamAvailable,
            "text/event-stream");
        return response;
    }

    private static void OnStreamAvailable(Stream stream, HttpContent headers, TransportContext context)
    {
        var clientStream = new StreamWriter(stream);
        ConnectedClients.Enqueue(clientStream);
    }

    private static void DoThings()
    {
        const string outboundMessage = "Test";

        foreach (var clientStream in ConnectedClients)
        {
            clientStream.WriteLine("data:" + JsonConvert.SerializeObject(outboundMessage));
            clientStream.Flush();
        }
    }
}

clientStream.Flush(); 的调用如预期且无一例外。

我在AngularJS中是这样处理的:

    $scope.handleServerCallback = function (data) {
        console.log(data);

        $scope.$apply(function() {
            $scope.serverData = data;
        });
    };


    $scope.listen = function () {
        $scope.eventSource = new window.EventSource("http://localhost:18270/api/sources/test");
        $scope.eventSource.onmessage = $scope.handleServerCallback;
        $scope.eventSource.onopen = function() { console.log("Opened source"); };
        $scope.eventSource.onerror = function (e) { console.error(e); };
    };

    $scope.listen();

我猜这是服务器的问题,因为我可以看到 test 调用中的 "EventStream" 在 chrome 调试器中是空的。

有谁知道如何确保消息到达客户端?

解决方案非常简单,根据规范,每一行都必须以 "\n" 结尾,最后一行必须以 "\n\n".

结尾

所以:

clientStream.WriteLine("data:" + JsonConvert.SerializeObject(outboundMessage) + "\n\n");

解决了。