使用 StreamJsonRpc 在 ASP.NET Core 中启用 JSON-RPC

boyanx2个月前技术教程7

StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC)。它通过流(如管道、网络流等)实现高效的跨进程或跨网络通信,特别适用于需要轻量级、灵活通信的场景。以下是对 StreamJsonRpc 的详细介绍,结合你提供的参考文章中的关键点:


1. 核心特性

  1. 基于流的通信
    支持通过 StreamPipeIDuplexPipe 进行数据传输,适用于管道、网络套接字、WebSocket 等多种底层传输机制。
  1. 双向通信
    允许客户端和服务端互相调用方法,实现双向交互(如客户端发起请求,服务端主动推送通知)。
  1. 强类型支持
    通过接口定义契约,方法调用和参数传递均支持强类型,减少手动序列化/反序列化的工作。
  1. 异步模型
    所有方法默认支持异步(async/await),适合高并发和低延迟场景。
  1. 跨平台兼容
    兼容 .NET Standard 2.0,可在 .NET Core、.NET Framework 和 Xamarin 等环境中使用。
  1. 扩展性
    提供自定义消息格式化(如 MessagePack 或自定义 JSON 序列化器)、错误处理、日志记录等扩展点。

2. 在 ASP.NET Core 中的集成

参考文章展示了如何将 StreamJsonRpc 集成到 ASP.NET Core 应用中,实现基于 HTTP 或 WebSocket 的 RPC 通信。以下是关键步骤:

2.1 配置服务端

  1. 添加 NuGet 包

    Install-Package StreamJsonRpc

    Plain Text

  1. 定义 RPC 接口

    public interface IGreeterRpcService

    {

    Task<string> GreetAsync(string name);

    }

    Plain Text

  1. 实现服务

    public class GreeterRpcService : IGreeterRpcService

    {

    public Task<string> GreetAsync(string name) => Task.FromResult($"Hello, {name}!");

    }

    Plain Text

  1. 配置 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. 高级用法

  1. 双向方法调用 客户端和服务端均可定义接口,实现双向通信。例如,服务端可以主动通知客户端:

    // 定义客户端可调用的接口

    public interface IClientCallback

    {

    Task NotifyAsync(string message);

    }




    // 服务端方法中调用客户端

    public async Task SendNotificationAsync()

    {

    var callback = JsonRpc.GetRpcTarget<IClientCallback>();

    await callback.NotifyAsync("New event!");

    }

    Plain Text

  1. 自定义序列化 默认使用 System.Text.Json,但可替换为其他序列化器(如 Newtonsoft.Json):

    var options = new JsonRpcOptions

    {

    MessageFormatter = new SystemTextJsonFormatter()

    };

    StreamJsonRpc.Attach(stream, service, options);

    Plain Text

  1. 错误处理 通过 JsonRpcException 捕获远程调用异常,支持自定义错误码和数据:

    try

    {

    await greeter.GreetAsync("error");

    }

    catch (JsonRpcException ex)

    {

    Console.WriteLine($"Error Code: {ex.ErrorCode}, Message: {ex.Message}");

    }

    Plain Text

  1. 性能优化
  • 使用 MemoryPoolBufferManager 减少内存分配。
  • 启用 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
  • 示例项目:https://github.com/tpeczek/Demo.AspNetCore.StreamJsonRpc

通过 StreamJsonRpc,开发者可以快速构建高效、灵活的 RPC 系统,尤其适合需要自定义通信协议或与现有基础设施集成的场景。

标签: js格式化json

相关文章

每天一个 Python 库:json 数据读写技巧合集,实战最常用!

在自动化测试、接口联调、配置管理中,我们经常会遇到 JSON 数据格式。Python 内置的 json 模块,让你轻松搞定数据的读写与转换,今天就带你系统掌握最常用的 json 操作技巧,一看就会,立...

ASP.NET Core Web API 中的 JSON 修补程序

包安装要在应用中启用 JSON Patch 支持,请完成以下步骤:安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。更新项目的 Startup.Co...

VS Code常用的插件分享

VS Code前端开发工具之必备插件,Visual Studio Code是由微软开发免费、开源、跨平台的一款IDE,支持多种编程语言开发,具有强大的插件扩展能力,这篇文章我们就来看看VS Code在...

轻量级的数据交换语言——JSON

JSON(JavaScript Object Notation,JavaScript对象表示法,读作/'desn/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的...

基于 JavaFx 搭建的实用小工具集合

大家好,我是 Java陈序员。作为一名后端程序员,常常需要在电脑上安装各种工具软件来支持日常开发。那么,是否有一款工具集合,包含各种工具,可以省去一一安装呢?答案是有的!今天,给大家介绍一个基于 Ja...

好用工具分享 - 漂亮的免费开源工具HTTP Toolkit

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)针对性地拦截 HTTP 和 HTTPS,包括以下客户端:桌面浏览器,如Chrome、Edge 和 FirefoxAndroid应用程序和浏览...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。