StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC)。它通过流(如管道、网络流等)实现高效的跨进程或跨网络通信,特别适用于需要轻量级、灵活通信的场景。以下是对 StreamJsonRpc 的详细介绍,结合你提供的参考文章中的关键点:
Stream
、Pipe
或 IDuplexPipe
进行数据传输,适用于管道、网络套接字、WebSocket 等多种底层传输机制。 async/await
),适合高并发和低延迟场景。 MessagePack
或自定义 JSON 序列化器)、错误处理、日志记录等扩展点。 参考文章展示了如何将 StreamJsonRpc 集成到 ASP.NET Core 应用中,实现基于 HTTP 或 WebSocket 的 RPC 通信。以下是关键步骤:
添加 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
客户端通过 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!"
双向方法调用 客户端和服务端均可定义接口,实现双向通信。例如,服务端可以主动通知客户端:
// 定义客户端可调用的接口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.MessagePackvar formatter = new MessagePackFormatter();
Plain Text
CancellationToken
。通过 StreamJsonRpc,开发者可以快速构建高效、灵活的 RPC 系统,尤其适合需要自定义通信协议或与现有基础设施集成的场景。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有