我一直在尝试将事件驱动推送到客户端浏览器。我正在使用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控件,我可以从服务器端事件中触发。
提前致谢
答案 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