我一直在尝试实现一个事件驱动的推到客户端浏览器。我正在使用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
2条答案
按热度按时间zaq34kh61#
我之前已经给出了这个答案,但让我详细说明一下:
查看Google Chrome开发人员工具中的“网络”选项卡,可以从您的http://live.meetscoresonline.com/test-sse.aspx中发现很多信息
根本没有生成SSE-要查看此信息,请单击Network下的Others按钮,这是您通常能够跟踪SSE数据流的位置
我在我的SSE中使用了下面的代码和一个简单的HTTPListener,它工作得很好,没有你提到的延迟,并且在使用这个polyfill时总是在浏览器中正确显示
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
另外,不要关闭响应,保持它打开,直到你想停止发送事件。
所以,从最初的帖子: