asp.net .Net服务器使用HTTP发送的事件不起作用

0lvr5msh  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(121)

我一直在尝试实现一个事件驱动的推到客户端浏览器。我正在使用ReactiveX从事件中生成HTTP任务,但我甚至无法让我的HttpHandlers输出它们的响应。
我尝试了一个简单的HTTP:

public class Handler2 : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/event-stream";
        HttpResponse response = context.Response;

        DateTime startdate = DateTime.Now;

        while (startdate.AddMinutes(10) > DateTime.Now)
        {
            JavaScriptSerializer js = new JavaScriptSerializer();

            string responseText = DateTime.Now.TimeOfDay.ToString();

            response.Write(string.Format("data: {0}",js.Serialize(responseText)));
            response.Flush();
            System.Threading.Thread.Sleep(1000);
        }
        response.Close();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

使用以下客户端代码:

function initialize() {

    if (window.EventSource == undefined) {
        document.getElementById('targetDiv').innerHTML = "Your browser doesn't support Server Side Events.";
        return;
    }

    var source = new EventSource('Handler2.ashx');

    source.onopen = function (event) {
        document.getElementById('targetDiv').innerHTML += 'Connection Opened.<br>';
    };

    source.onerror = function (event) {
        if (event.eventPhase == EventSource.CLOSED) {
            document.getElementById('targetDiv').innerHTML += 'Connection Closed.<br>';
        }
    };

    source.onmessage = function (event) {
        document.getElementById('targetDiv').innerHTML += event.data + '<br>';
    };
}

我有一个更复杂的HttpTaskAsyncUNK准备挂接,但我甚至不能让这个工作>_<我得到连接打开消息,Handler2.ashx似乎保持连接(查看Chrome开发工具/网络)。
另一方面,我从SignalR连接中获取一些数据?

"ws://localhost:50022/ed4b66c7eb394a8789b5f6a631f4ff09/arterySignalR/connect?.."

我设置错了吗?就我在其他示例中看到的情况而言,这段代码应该可以按原样工作。请任何人都可以帮助我。我只是想要一个简单的SSE控制,我可以从服务器端事件触发。
Thanks in advance

zaq34kh6

zaq34kh61#

我之前已经给出了这个答案,但让我详细说明一下:
查看Google Chrome开发人员工具中的“网络”选项卡,可以从您的http://live.meetscoresonline.com/test-sse.aspx中发现很多信息
根本没有生成SSE-要查看此信息,请单击Network下的Others按钮,这是您通常能够跟踪SSE数据流的位置
我在我的SSE中使用了下面的代码和一个简单的HTTPListener,它工作得很好,没有你提到的延迟,并且在使用这个polyfill时总是在浏览器中正确显示

res.AddHeader("Content-Type", "text/event-stream")
        res.AddHeader("Cache-Control", "no-cache")
        res.AddHeader("Access-Control-Allow-Origin", "*")
        res.KeepAlive = True
ubof19bj

ubof19bj2#

对于任何有相同问题的人,请确保您遵循SSE要求的确切格式:
data:my_data_contents_here\n\n
前缀“data:“很重要,最后的两个换行符也很重要。否则,客户端将永远不会接收事件。
以下是标准的描述:https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
另外,不要关闭响应,保持它打开,直到你想停止发送事件。
所以,从最初的帖子:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/event-stream";
    HttpResponse response = context.Response;
    response.KeepAlive = true; // i think this already defaults to true though
    DateTime startdate = DateTime.Now;

    while (startdate.AddMinutes(10) > DateTime.Now)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        string responseText = DateTime.Now.TimeOfDay.ToString();
        
        // If it's just plain text, you can actually use: Encoding.ASCII.GetBytes($"data:{responseText}\n\n");
        response.Write(string.Format("data: {0}\n\n",js.Serialize(responseText)));
        response.Flush();
        System.Threading.Thread.Sleep(1000);
    }
    response.Close();
}

相关问题