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이 있을까요?
채널을 튜닝하는 새로운 브라우저가 채널에서 잘못 청크 될 수있는 메시지를 트리거하여 조정 된 다른 브라우저를 방해합니다. 동일한 채널로 조정 된 여러 브라우저의 경우, 발에 등을 돌리고 잠재적으로 다른 사용자를 방해하여 동기화 요청을 보내거나받을 수 없습니다. NotifyChannel을 호출하는 동기화 POST 요청이 항상 완벽하게 작동하기 때문에 희망이 있습니다. 그래서 어떻게 든 NotifyChannel은 제대로 청크 처리 된 메시지를 보내지 만 onConnect는 그렇지 않습니다. 확실히 이것을 고치는 방법이 있어야합니다! –
@AlexZubrinsky Transfer-Encoding 응답은 프레임 워크에서 생성되지 않으며 요청 길이를 결정할 수 없을 때 기본 웹 플랫폼에 의해 암시 적으로 추가됩니다. 솔루션은 모노를 사용하여 .NET 코어로 마이그레이션하는 경우입니다. Mono의 ASP.NET 구현은 아무도 지원하지 않고 버그가 있습니다. – mythz
감사합니다! 우리는 언젠가 .NET 코어로 끝날 것입니다. –