2017-05-15 86 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

謝謝!是的,當錯誤重新連接客戶端與事件流。 –