2017-05-15 8 views
1

문제를 해결하려고하지만 그 이유를 이해할 수 없습니다.ServiceStack 서버 측 이벤트 오류

Google 크롬에서이 오류가 발생합니다. 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 상태 = 401).

이제 SessionId를 보내면 두 클라이언트가 모든 이벤트를 수신하는 이유가 생깁니다.

각 사용자가 자신의 일정을 받도록 만들 수 있습니까?

var eventSource = new EventSource ('/ event-stream'); 클라이언트

처리기 : 나는 그들에게 세션 ID 보낼 경우 두 클라이언트가 모든 이벤트를 수신하는 이유

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

Chrome의 WebInspector 또는 Fiddler를 사용하여 캡처 할 수있는 원시 HTTP 응답을 볼 때 문제가 분명하게 드러날 수 있습니다. 질문을 업데이트하여 (예기치 않은 응답이 발생할 때 이후 질문 용으로) . – mythz

답변

2

지금 문제가 발생?

세션 ID로 보내는 알림은 세션 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

감사합니다! 오류가 클라이언트를 이벤트 스트림과 다시 연결할 때 오류가 발생 했습니까? –