ServiceStack 服务器端事件错误
ServiceStack Server-Side Events errors
正在尝试解决问题,但无法理解为什么会出现此类错误。
我在 cosole Google Chrome 中收到此错误:EventSource 的响应的 MIME 类型 ("text/html") 不是 "text/event-stream"。正在中止连接。
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...});
感谢帮助!
.........
在使用 Fidler 分析请求后(感谢@mythz 的想法)我发现了以下内容:
有 2 个客户端浏览器 运行 服务器事件的处理程序,如果您在一个浏览器中注销,那么另一个将获得 2 个事件,一个正常,另一个 "EventSource''s response has a MIME type"(http status=401).
现在问题来了,如果我向它们发送 SessionId,为什么两个客户端都会收到所有事件?
您可以让每个用户都收到他们的事件吗?
var eventSource = new EventSource('/event-stream');
客户端处理程序:
$(eventSource).handleServerEvents({
handlers: {
DataRetModel: function (data) {
console.log(data);
}
}
});
Now the question arises why both clients receive all events if I send them the SessionId?
通过 SessionId 发送通知会将其发送给具有相同会话 ID 的所有客户端,如果您使用的是浏览器,则意味着所有浏览器选项卡。
如果您只想将其发送到单个 SSE 订阅(即单个浏览器选项卡),则需要将其发送到客户端 SSE SubscriptionId
,您需要将其传递到您的服务中,以便它知道将通知发送到哪里。您可以在 SSE 客户端建立连接后从 onConnect
处理程序中获取 subscriptionId。
正在尝试解决问题,但无法理解为什么会出现此类错误。
我在 cosole Google Chrome 中收到此错误:EventSource 的响应的 MIME 类型 ("text/html") 不是 "text/event-stream"。正在中止连接。
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...});
感谢帮助!
.........
在使用 Fidler 分析请求后(感谢@mythz 的想法)我发现了以下内容: 有 2 个客户端浏览器 运行 服务器事件的处理程序,如果您在一个浏览器中注销,那么另一个将获得 2 个事件,一个正常,另一个 "EventSource''s response has a MIME type"(http status=401).
现在问题来了,如果我向它们发送 SessionId,为什么两个客户端都会收到所有事件?
您可以让每个用户都收到他们的事件吗?
var eventSource = new EventSource('/event-stream');
客户端处理程序:
$(eventSource).handleServerEvents({
handlers: {
DataRetModel: function (data) {
console.log(data);
}
}
});
Now the question arises why both clients receive all events if I send them the SessionId?
通过 SessionId 发送通知会将其发送给具有相同会话 ID 的所有客户端,如果您使用的是浏览器,则意味着所有浏览器选项卡。
如果您只想将其发送到单个 SSE 订阅(即单个浏览器选项卡),则需要将其发送到客户端 SSE SubscriptionId
,您需要将其传递到您的服务中,以便它知道将通知发送到哪里。您可以在 SSE 客户端建立连接后从 onConnect
处理程序中获取 subscriptionId。