개발관련/C#

SignalR MessageFormat 및 구동 시퀸스

Diademata 2018. 7. 14. 23:58
반응형

code : https://github.com/EomTaeWook/CS-API.Core.WebSocket


작업 중인 소스 .Net Core에 익숙해지기 위해 Core로 작성


http://blogs.microsoft.co.il/applisec/2014/03/12/signalr-message-format/


현재 웹 소켓을 사용할 프로젝트가 있는데


SignalR C++이 카사블랑카(VS2013, VS2015)에서 구동 + SignalR(C++11에서 사용하는 문법(람다식 등))이 존재


현재 클라이언트 프로젝트가 VS2010 C++단에서 돌아가는 환경이라(좀 바꾸자...) SignalR 을 사용하지 못한다.


.Net 환경의 기본 API Websocket 으로 서버를 구성해야 해야 할 판이라 SignalR의 통신 구조가 너무 맘에 드는 관계로


SignalR 의 형태로 제작하려고 한다. (서버 -> 클라이언트 함수 호출, 클라이언트 -> 서버 함수 호출)



SignalR 의 흐름


(C->S)Negotiation -> (S->C)토큰 생성. Response


(C->S)Connect Transports를 선택(sse, longpooling... 자동 선택) -> (S->C) HearBeat 생성. -> Response


(C->S)Start->(S) 인증 및 Hub 확인.


이후 Send url을 달고이후 밑의 포맷대로 송수신 하는 것 같다. (웹 소켓 제외)


소스 분석은 흐름만 파악하고 이 형태로 개발하기 위함이므로 자세히 파보지는 않았음으로 틀렸을 수도 있다.


http://localhost:8080/signalr/send?clientProtocol=1.4&transport=serverSentEvents&connectionData=[%7B%22Name%22:%22Chat%22%7D]&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAoZNjIPEGw02gtEuCVyuU9wAAAAACAAAAAAAQZgAAAAEAACAAAAC48hm5UjuOAIFv3EV3wVKDOrARoODHn7%2FnszwnFA%2FqowAAAAAOgAAAAAIAACAAAAB8yo7vtBUCftMubFVHydoqqFMOihURRECXFJ45iRUOaTAAAAAUnG1QclrL4bpwPsAdt4EtdubVjHEdggFY1QtxTmZWBZ2N60yHlioXbTIMvymSaktAAAAALHWD0Zm0RQkRz07dnnTgLdYhmJVTY8SeylYY3G8NEo2X4Qx93dROFU88aHg%2BJslcKNAakDTtjnHmHkw57E9YIA%3D%3D


SSE Foramt

{"C":"d-E73E9074-B,7|C,0|D,1","M":[{"H":"Chat","M":"send","A":["test"]}]}


WebSocket Foramt

Value에 {"H":"Chat","M":"send","A":["test"]}가 들어감


{

  "Source": "f11a643d-914a-4951-9c1f-ab7c1f6fb0ef",

  "Key": "h-Chat",

  "Value": [

    123,

    34,

    72,

    34,

    58,

    34,

    67,

    104,

    97,

    116,

    34,

    44,

    34,

    77,

    34,

    58,

    34,

    115,

    101,

    110,

    100,

    34,

    44,

    34,

    65,

    34,

    58,

    91,

    34,

    116,

    101,

    115,

    116,

    34,

    93,

    125

  ],

  "CommandId": null,

  "WaitForAck": false,

  "IsAck": false,

  "Filter": "",

  "Encoding": {

    "BodyName": "utf-8",

    "EncodingName": "Unicode (UTF-8)",

    "HeaderName": "utf-8",

    "WebName": "utf-8",

    "WindowsCodePage": 1200,

    "IsBrowserDisplay": true,

    "IsBrowserSave": true,

    "IsMailNewsDisplay": true,

    "IsMailNewsSave": true,

    "IsSingleByte": false,

    "EncoderFallback": {

      "DefaultString": "�",

      "MaxCharCount": 1

    },

    "DecoderFallback": {

      "DefaultString": "�",

      "MaxCharCount": 1

    },

    "IsReadOnly": true,

    "CodePage": 65001

  },

  "MappingId": 0,

  "StreamIndex": 0,

  "IsCommand": false

}




Hub Message Format

Hub Request format ("send" request)


Data={"I":index,"H":"samplingstreaminghub","M":"ConnectToStream","A":["StreamUri"]}


Hubs messages format (server to client)


– {"C":"messageId value", "M":[{"H":"HubName","M":"HandlerName","A": ["argument list as json"]}]}


– {"C":"messageId value", "G": ["groupName"],"g": ["groupName"],"T":1,

    "M":[{"H":"HubName","M":"HandlerName","A": ["argument list as json"]}]}


Hub Payloads format ("send" request or inside "M" element of Hub message)


- {"H":"HubName","M":"HandlerName","A": [argument list as json],                                    "S":{state as json},"I":index}

- {"H":"HubName","M":"HandlerName","A": [argument list as json],"I":index} 

Hub Response examples ("send" response)

- {"I":"0","R":{"return object as json}}

- {"I": 0} -> no result

- {"I": 0, "S":{"x":1},"R":1} –> result

- {"I": 0, "E":"This is an error"} –> error

- {"I": 0, "E":"This is an error", "T": "Some stack trace here"} -> error + stack

The following is a complete list of the messages elements:

Hub Messages:


C – Cursor

M – Messages

T – Timeout (only if true) value is 1

D – Disconnect (only if true) value is 1

R – All Groups (Client groups should be reset to match this list exactly)

G – Groups added

g – Groups removed



Hub payload:


I – Callback Operation index

H – Hub name

M – method name

A – arguments

S – state (if not null)



Hub Method return value:


I – Operation index

R – Result

S – State

E – Error

T – stack trace

D – Error Data

반응형

'개발관련 > C#' 카테고리의 다른 글

C++/CLI를 통한 C++ 클래스 마샬링  (0) 2018.08.11
sql compact 4.0 설정  (2) 2018.07.30
네트워크 공유 폴더 접근  (0) 2018.05.09
Winform Control 안쪽 여백 제거  (0) 2018.04.08
쿼드 트리  (0) 2018.03.28