使用HttpHandler的.Net Server-Sent事件不起作用

时间:2015-03-06 13:37:44

标签: asp.net html5 httphandler server-sent-events

我一直在尝试将事件驱动推送到客户端浏览器。我正在使用ReactiveX从事件中生成异步任务,但我甚至无法让我的HttpHandler输出它们的响应。

我尝试过一个简单的HttpHandler:

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>';
        };
    }

我有更多更复杂的HttpTaskAsyncHandler准备连接,但我甚至无法使这个工作&gt; _&lt; 我收到Connection Opened消息,Handler2.ashx似乎保持连接(查看Chrome开发工具/网络)。

另一方面,我从SignalR连接获取一些数据?

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

我说错了吗? 就我在其他示例中看到的而言,此代码应该按原样运行。请任何人帮助我。我只想要一个简单的SSE控件,我可以从服务器端事件中触发。

提前致谢

1 个答案:

答案 0 :(得分:0)

我之前已经给出了这个答案,但让我详细说明:

查看Google Chrome开发者工具中的“网络”标签,可以从http://live.meetscoresonline.com/test-sse.aspx

中了解到很多内容

根本没有生成SSE - 要点击网络下的其他按钮,这是您通常能够跟踪SSE数据流的地方

我使用简单的HTTPListener在我的SSE中使用以下代码,并且它没有您提到的延迟,并且在使用此polyfill时始终在浏览器中正确显示

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