2017-05-15 91 views
1

试图处理这个问题,但不明白为什么出这种错误。ServiceStack服务器端事件错误

我在cosable谷歌浏览器中得到这个错误:EventSource的响应有一个不是“text/event-stream”的MIME类型(“text/html”)。中止连接。

public class Item { 
    public int Index { get; set; } 
    public int Value { get; set; } 
} 

public class DataRetModel {   
    public List<Item> Items { get; set; } 
    public Item Item { get; set; }   
} 

ServerEvents.NotifySession(user.SessionId, new DataRetModel{...init...}); 

感谢您的帮助!

.........

分析使用菲德勒(为理念感谢@mythz)的请求后,我发现以下几点: 存在正在运行的服务器事件处理程序2客户端浏览器,如果你在一个浏览器中注销,然后另一个会得到2个事件,一个正常,另一个“EventSource”的响应具有MIME类型“(http status = 401)。

现在的问题是,为什么两个客户端都收到所有事件,如果我向他们发送SessionId?

您可以让每个用户都能收到他们的活动吗?

var eventSource = new EventSource('/ event-stream');

处理程序在客户端上:

$(eventSource).handleServerEvents({ 
    handlers: { 
     DataRetModel: function (data) { 
      console.log(data); 
     } 
    }   
}); 
+1

在查看您可以使用Chrome的WebInspector或Fiddler捕获的原始HTTP响应时,很可能会使问题显而易见,请更新您的问题以包含该问题(以及针对将来出现意外响应的问题) 。 – mythz

回答

2

现在的问题是,为什么这两个客户端接收所有事件,如果我给他们的SessionID?

通过SessionId发送通知将发送给具有相同会话ID的所有客户端,如果您使用的是浏览器,则表示所有浏览器选项卡。

如果您只希望将其发送给单个SSE订阅(即单个浏览器选项卡),则需要将其发送到客户端SSE SubscriptionId,您需要将其传递到您的服务,以便它知道要发送到哪里通知。在SSE客户端建立连接后,您可以从onConnect处理程序获取subscriptionId。

+0

我的客户在不同的浏览器和不同的选项卡上打开,按照您的说法操作。但问题重复,详细信息,你可以看到链接[链接到错误](https://www.youtube.com/watch?v=CaW-4CdibDg):HTTP/1.1 404订阅'kyZfS0KTourgi2zUe38B'不存在 –

+0

@ MherArsh表示订阅不存在,例如可能是由于客户端没有及时响应心跳,所以服务器删除了订阅,客户端也可能明确退订等。如果客户端仍然连接,它应该在检测到错误时自动重新连接。 – mythz

+0

谢谢!是的,当错误重新连接客户端与事件流。 –