使用 StreamJsonRpc 在 ASP.NET Core 中啟用 JSON-RPC
StreamJsonRpc 是微軟開發的一個開源庫,用于在 .NET 平臺中實現基于 JSON-RPC 2.0 規范 的遠程過程調用(RPC)。它通過流(如管道、網絡流等)實現高效的跨進程或跨網絡通信,特別適用于需要輕量級、靈活通信的場景。以下是對 StreamJsonRpc 的詳細介紹,結合你提供的參考文章中的關鍵點:
1. 核心特性
- 基于流的通信 支持通過
Stream、Pipe或IDuplexPipe進行數據傳輸,適用于管道、網絡套接字、WebSocket 等多種底層傳輸機制。
- 雙向通信 允許客戶端和服務端互相調用方法,實現雙向交互(如客戶端發起請求,服務端主動推送通知)。
- 強類型支持 通過接口定義契約,方法調用和參數傳遞均支持強類型,減少手動序列化/反序列化的工作。
- 異步模型 所有方法默認支持異步(
async/await),適合高并發和低延遲場景。
- 跨平臺兼容 兼容 .NET Standard 2.0,可在 .NET Core、.NET Framework 和 Xamarin 等環境中使用。
- 擴展性 提供自定義消息格式化(如
MessagePack或自定義 JSON 序列化器)、錯誤處理、日志記錄等擴展點。
2. 在 ASP.NET Core 中的集成
參考文章展示了如何將 StreamJsonRpc 集成到 ASP.NET Core 應用中,實現基于 HTTP 或 WebSocket 的 RPC 通信。以下是關鍵步驟:
2.1 配置服務端
添加 NuGet 包
Install-Package StreamJsonRpc
Plain Text
定義 RPC 接口
public interface IGreeterRpcService
{
Task<string> GreetAsync(string name);
}
Plain Text
實現服務
public class GreeterRpcService : IGreeterRpcService
{
public Task<string> GreetAsync(string name) => Task.FromResult($"Hello, {name}!");
}
Plain Text
配置 ASP.NET Core 中間件 使用
UseWebSockets()啟用 WebSocket 支持,并處理 RPC 請求:app.UseWebSockets();
app.Use(async (context, next) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
var service = new GreeterRpcService();
await StreamJsonRpc.Attach(webSocket, service);
}
else await next();
});
Plain Text
2.2 客戶端實現
客戶端通過 WebSocket 或其他流連接到服務端,并調用遠程方法:
var webSocket = new ClientWebSocket();
await webSocket.ConnectAsync(new Uri("ws://localhost:5000"), CancellationToken.None);
var greeter = StreamJsonRpc.JsonRpc.Attach<IGreeterRpcService>(webSocket);
string result = await greeter.GreetAsync("World");
Console.WriteLine(result); // 輸出 "Hello, World!"
3. 高級用法
雙向方法調用 客戶端和服務端均可定義接口,實現雙向通信。例如,服務端可以主動通知客戶端:
// 定義客戶端可調用的接口
public interface IClientCallback
{
Task NotifyAsync(string message);
}
// 服務端方法中調用客戶端
public async Task SendNotificationAsync()
{
var callback = JsonRpc.GetRpcTarget<IClientCallback>();
await callback.NotifyAsync("New event!");
}
Plain Text
自定義序列化 默認使用
System.Text.Json,但可替換為其他序列化器(如 Newtonsoft.Json):var options = new JsonRpcOptions
{
MessageFormatter = new SystemTextJsonFormatter()
};
StreamJsonRpc.Attach(stream, service, options);
Plain Text
錯誤處理 通過
JsonRpcException捕獲遠程調用異常,支持自定義錯誤碼和數據:try
{
await greeter.GreetAsync("error");
}
catch (JsonRpcException ex)
{
Console.WriteLine($"Error Code: {ex.ErrorCode}, Message: {ex.Message}");
}
Plain Text
- 性能優化
- 使用
MemoryPool或BufferManager減少內存分配。
啟用
MessagePack二進制協議以降低傳輸開銷:Install-Package StreamJsonRpc.MessagePack
var formatter = new MessagePackFormatter();
Plain Text
4. 適用場景
- 微服務間通信:輕量級替代 gRPC 或 REST。
- AI應用:ModelContextProtocol(MCP)和Agent2Agent(A2A)協議都是使用JSON-RPC 2.0。
- 桌面應用插件系統:主進程與插件進程通信。
- 實時應用:如聊天、實時數據推送(結合 WebSocket)。
- 跨語言集成:通過標準 JSON-RPC 與其他語言(如 Python、JavaScript)交互。
5. 注意事項
- 線程安全:確保服務實現是線程安全的。
- 超時控制:為長時間運行的方法配置
CancellationToken。
- 安全:啟用 TLS 加密網絡流,驗證調用方身份。
6. 參考資源
- 官方文檔:https://github.com/microsoft/vs-streamjsonrpc
- JSON-RPC 2.0 規范:jsonrpc.org
通過 StreamJsonRpc,開發者可以快速構建高效、靈活的 RPC 系統,尤其適合需要自定義通信協議或與現有基礎設施集成的場景。
歡迎大家掃描下面二維碼成為我的客戶,扶你上云

浙公網安備 33010602011771號