누구나 SignalR이 내부적으로 어떻게 높은 수준으로 작동하는지 알려줄 수 있습니까?
나는 그것을 사용하여 데이터를 플러시하고 Response.Flush
클라이언트 측에서 일정한 간격으로 Ajax 요청을 보내고 있다고 생각합니다. 맞습니까?
답변
아니요, SignalR은 연결을 통한 추상화입니다. 해당 연결을 통해 두 가지 프로그래밍 모델 (허브 및 영구 연결)을 제공합니다. SignalR에는 전송 개념이 있으며 각 전송은 데이터의 송수신 방법과 연결 및 연결 해제 방법을 결정합니다.
SignalR에는 몇 가지 내장 전송이 있습니다.
- 웹 소켓
- 서버가 보낸 이벤트
- 영원히 프레임
- 긴 폴링
SignalR은 서버와 클라이언트가 지원하는 “최상의”연결을 선택하려고합니다 (특정 전송을 사용하도록 강제 할 수도 있음).
그것은 높은 수준입니다. 각 전송이 어떻게 구현되는지 보려면 소스 코드를 살펴보십시오 .
각 전송에 대한 클라이언트 코드도 있습니다.
https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
특히 긴 폴링 전송 작동 방식에 대해 문의하는 경우 :
신호가 응답하기 위해 비동기식으로 대기중인 서버로 아약스 요청을 보냅니다. 신호가 있거나 요청 시간이 초과되면 서버에서 반환되어 다른 요청을 보내고 프로세스가 계속됩니다. (클라이언트가 메시지를 놓치지 않도록 클라이언트가 확인한 내용을 추적하는 방법에 대한 세부 정보를 남겼습니다)
잘하면 그것은 대부분의 질문에 대답합니다.
답변
@davidfowl은 이미 주요 부분에 답변했습니다. 그러나 전송 동작의 차이, 특히 WebSocket과 다른 전송 간의 차이점에 대한 자세한 정보를 제공합니다. 아래는 몇 가지 사항입니다.
- WebSocket은 클라이언트와 서버간에 진정한 지속적인 양방향 연결을 설정하는 유일한 전송입니다. 그러나 WebSocket은 IIS 8 이상과 최신 버전의 Internet Explorer, Chrome 및 Mozilla Firefox에서만 지원됩니다.
- Server Sent Events, Forever Frame 및 Long polling 동안 세 가지 모두 단방향 통신을 따르며 대부분의 브라우저에서 지원됩니다.