StreamJsonRpc 是一個實現了 JSON-RPC 通訊協議的開源 .NET 庫,在介紹 StreamJsonRpc 以前,咱們先來了解一下 JSON-RPC。git
JSON-RPC 是一個無狀態且輕量級的遠程過程調用(RPC)協議,其使用 JSON(RFC 4627)做爲數據格式。github
目前 JSON-RPC 的版本已發展到 2.0,JSON-RPC 2.0 與 1.0 的約定規範是不同的。2.0 包含一個名爲 jsonrpc
且值爲 2.0
的成員,而 1.0 版本是不包含的。因此咱們能夠很容易在兩個版本間區分出 2.0。json
JSON-RPC 在客戶端與服務端之間交換的全部成員名應是區分大小寫的,函數、方法、過程都認爲是可互換的。客戶端被定義爲請求對象的來源及響應對象的處理程序;服務端被定義爲響應對象的起源和請求對象的處理程序。數組
發送一個請求對象至服務端表明一個 RPC 調用,JSON-RPC 2.0 規定一個請求對象包含下列成員:架構
沒有包含 id
成員的請求對象爲通知,做爲通知的請求對象代表客戶端對服務端響應不感興趣,服務端能夠不響應請求對象給客戶端。併發
下面是幾個請求對象的 JSON 結構示例(「-->」表示發送,「<--」表示響應,下同):函數
--> { "jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1 } --> { "jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4} --> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]} // 通知
當客戶端發起一個 RPC 調用時,除通知以外,服務端都必須回覆響應。響應也表示爲一個 JSON 對象,使用如下成員:插件
響應對象必須包含 result 或 error 成員之一。代理
響應對象的 error 成員的結構包含下列成員:code
其中 -32768 至 -32000 爲保留的預約義錯誤代碼,各保留錯誤代碼的含義請查看文末參考連接[1]。
下面是幾個響應對象的 JSON 結構示例:
<-- {"jsonrpc": "2.0", "result": 19, "id": 1} <-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"} <-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null} // 無效調用
當須要同時發送多個請求對象時,客戶端能夠發送一個包含全部請求對象的數組。
當批量調用的全部請求對象處理完成時,服務端則須要返回一個包含相對應的響應對象數組。每一個響應對象都應對應每一個請求對象,除非是通知的請求對象。服務端能夠併發的,能夠以任意順序和任意寬度並行處理這些批量調用。而客戶端應該是基於各個響應對象中的 id 成員來匹配對應的請求對象。
若批量調用沒有須要返回的響應對象,則服務端不須要返回任何結果。
下面是一個批量請求及響應的 JSON 結構示例:
--> [ {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, {"foo": "boo"}, {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"}, {"jsonrpc": "2.0", "method": "get_data", "id": "9"} ] <-- [ {"jsonrpc": "2.0", "result": 7, "id": "1"}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"}, {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"} ]
當批量請求對象都是通知時,服務端不須要返回結果。
StreamJsonRpc 是一個實現了 JSON-RPC 通訊協議的 .NET 庫,支持 .NET Core。它把 RPC 的調用封裝爲公開的 .NET API,能夠很方便的進行 RPC 請求的發送和接收操做。StreamJsonRpc 是微軟官方的一個開源庫,目前 Star 數接近 300,貌似知道的人很少或者用的人很少。GitHub 地址:
github.com/microsoft/vs-streamjsonrpc
StreamJsonRpc 能夠在 Stream、WebSocket 或 System.IO.Pipelines 管道上工做,獨立於底層傳輸。除了包含 JSON-RPC 規範所需的特性外,它額外還有以下優勢:
使用 StreamJsonRpc 主要有四個基本步驟:創建 JSON-RPC 鏈接、發送 RPC 請求、接收 RPC 請求、斷開鏈接。
這一篇主要介紹一些預備知識,下一篇將經過示例演示並詳細介紹 StreamJsonRpc 的使用,敬請期待!
參考:
[1].jsonrpc.org/specification
[2].github.com/microsoft/vs-streamjsonrpc