2017-11-23 3 views
1

ServiceStack의 서버 이벤트 기능 사용과 관련하여 SSE에서 Chrome에 ERR_INVALID_CHUNKED_ENCODING을 제공합니다. 교차 출처 HTTP 요청이없는 경우 두 개의 브라우저를 동기화 할 수 있습니다. 문서화 된 것처럼 간단하게 작동합니다.ServiceStack CORS CORS

(1) Plugins.Add (새 ServerEventsFeature());

(2) SyncRequest 종점 :

[Route("/channels/{Channel}/sync", "POST")] 
    public class SyncRequest : IReturnVoid 
    { 
     public string From { get; set; } 
     public string ToUserId { get; set; } 
     public string Channel { get; set; } 
     public string Message { get; set; } 
     public string Selector { get; set; } 
    } 
    public class SyncService : Service 
    { 
     public IServerEvents ServerEvents { get; set; } 

     public void Any(SyncRequest request) 
     { 
      ServerEvents.NotifyChannel(request.Channel, "sync", request.From); 
     } 
    } 

(3) 브라우저에서 :이

var mychannel = 'example'; 
    var source= new EventSource(`${serviceUrl}/event-stream?channel={mychannel}`); 
    source.onmessage = (m) => {}; // etc. 

난 (하나의 브라우저로) SyncRequest 포인트를 호출하여 브라우저를 동기화 처리 다른 브라우저의 EventSource에서 나오는 메시지 동기화 서버가 다른 도메인에 있고 출처 간 HTTP 요청을 필요로하는 경우

그러나, 그것은 실패합니다. Plugins.Add(new CorsFeature(...))이 잠시 후에 작동하지만 Chrome (Linux)에서 처음에는 콘솔에 ERR_INVALID_CHUNKED_ENCODING 오류가 표시됩니다.

인터넷에서 나는 Chrome이 엄격하다고 주장합니다. 이것은 ERR_INVALID_CHUNKED_ENCODING 오류가 발생할 수 있음을 나타냅니다. 또한/event-stream 호출에 대한 응답은 Transfer-Encoding:chunked 헤더를 가지고 있지만 실제로 이것이 원인인지 여부는 알 수 없습니다. 그렇다면 어떻게 제거 할 수 있습니까? 그 응답 헤더가 Transfer-Encoding:chunked을 포함 (그리고 하트 비트는 기본적으로 Transfer-Encoding:identity있다) -

Plugins.Add(new ServerEventsFeature { 
     OnInit = request => { 
      request.Response.AddHeader("Transfer-Encoding", "identity"); 
     }, 
     OnHeartbeatInit = request => { 
      request.Response.AddHeader("Transfer-Encoding", "identity"); 
     } 
    }); 

을 그러나 이것은 /event-stream?channel=example 호출에 영향을주지 않습니다 : another question on ServiceStack's SSE plus CORSmythz에서

는 응답 헤더과 같이 변경 될 수 있음을 시사한다.

이제 브라우저는 /event-stream?channel=example을 사용하여 연결을 재설정하고 처음에는 성공했습니다. EventSource 객체가 작동하고 하트 비트가 발생하며 동기화가 가능합니다.

ServiceStack/4.512 NET45 Unix/Mono를 사용하고 있습니다.

그래서 질문입니다 : ERR_INVALID_CHUNKED_ENCODING 오류없이 즉시 SSE 연결을 설정하는 방법이 있습니까? 어쩌면 ServiceStack에 common error referred to in another question이 있을까요?

답변

1

Chunked Transfer-Encoding은 길이를 알 수없는 Server Sent Events의 장기 실행 HTTP 응답에서 정상입니다. Mono의 HTTP 구현으로 인해 문제가 발생할 가능성이 있습니다. Linux/OSX에서 실행중인 경우 지원되는 옵션 인 run ServiceStack on .NET Core 대신에 권장됩니다.

+0

채널을 튜닝하는 새로운 브라우저가 채널에서 잘못 청크 될 수있는 메시지를 트리거하여 조정 된 다른 브라우저를 방해합니다. 동일한 채널로 조정 된 여러 브라우저의 경우, 발에 등을 돌리고 잠재적으로 다른 사용자를 방해하여 동기화 요청을 보내거나받을 수 없습니다. NotifyChannel을 호출하는 동기화 POST 요청이 항상 완벽하게 작동하기 때문에 희망이 있습니다. 그래서 어떻게 든 NotifyChannel은 제대로 청크 처리 된 메시지를 보내지 만 onConnect는 그렇지 않습니다. 확실히 이것을 고치는 방법이 있어야합니다! –

+0

@AlexZubrinsky Transfer-Encoding 응답은 프레임 워크에서 생성되지 않으며 요청 길이를 결정할 수 없을 때 기본 웹 플랫폼에 의해 암시 적으로 추가됩니다. 솔루션은 모노를 사용하여 .NET 코어로 마이그레이션하는 경우입니다. Mono의 ASP.NET 구현은 아무도 지원하지 않고 버그가 있습니다. – mythz

+0

감사합니다! 우리는 언젠가 .NET 코어로 끝날 것입니다. –