基于C# proto3生成Kestrel REST/JSON-RPC服务的工具咨询
完全不用手动从头实现!.NET生态里有不少工具和框架能帮你基于gRPC的服务定义,快速生成和gRPC方法完全匹配、支持重写的REST/JSON-RPC服务器代码,不管是用Kestrel(ASP.NET Core)还是Nancy都有方案。
一、基于ASP.NET Core(Kestrel)的首选方案
1. 利用ASP.NET Core的gRPC JSON转码 + 自动生成控制器
如果你的gRPC服务是用Grpc.AspNetCore构建的,ASP.NET Core 6+自带的AddJsonTranscoding方法可以让你的gRPC服务直接处理REST/JSON请求,但如果需要生成独立的、可重写的MVC控制器类,推荐结合以下工具:
- 第一步:生成OpenAPI文档
安装Grpc.AspNetCore.OpenApi包,在Program.cs中配置让gRPC服务暴露OpenAPI 3.0文档:builder.Services.AddGrpc() .AddJsonTranscoding() // 启用JSON转码,同时支持gRPC和REST .AddOpenApi(); // 配置Swagger UI查看OpenAPI文档 builder.Services.AddSwaggerGen(); - 第二步:用NSwag生成可重写的MVC控制器
用NSwag工具扫描生成的OpenAPI文档,自动生成ASP.NET Core MVC控制器代码。生成的控制器方法签名会和你的gRPC服务方法一一对应,你可以直接在这些方法里重写逻辑,或者调用原gRPC服务的实现:
比如,NSwag的命令行工具可以这样生成:
生成的控制器类里每个方法都对应一个gRPC接口方法,你可以轻松重写它们来定制REST行为。nswag openapi2cscontroller /input:https://your-api/swagger/v1/swagger.json /output:Controllers/GrpcRestController.cs /namespace:YourApp.Controllers /controllerBaseClass:Microsoft.AspNetCore.Mvc.ControllerBase
2. 基于Protobuf定义直接生成REST控制器
如果还没编写gRPC服务代码,可以用protoc的社区插件(比如protoc-gen-csharp-rest),直接从.proto文件生成ASP.NET Core MVC控制器代码。这些生成的控制器会包含和gRPC方法完全匹配的可重写方法,你只需要填充业务逻辑即可。
二、NancyFX的方案
对于Nancy,虽然没有官方的直接生成工具,但可以通过以下方式快速实现:
- 用T4模板读取你的gRPC服务接口(比如生成的
.cs文件中的gRPC服务抽象类),自动生成Nancy模块代码。模板可以遍历gRPC的方法定义,生成对应的Get/Post路由,以及和gRPC方法签名一致的处理方法,你可以直接重写这些方法。 - 或者使用
protobuf-net.Grpc生成的gRPC服务契约,结合Nancy的JsonBodyDeserializer,快速映射请求到gRPC方法参数,减少手动编写的工作量。
三、JSON-RPC的额外支持
如果需要JSON-RPC API,可以用JsonRpc.Microsoft.AspNetCore.Server(针对Kestrel)或者Nancy.JsonRpc(针对Nancy),结合gRPC的方法定义,快速生成JSON-RPC端点。这些工具可以自动将gRPC的方法映射为JSON-RPC的方法名,参数和返回值也会自动序列化/反序列化。
总结
你完全不需要手动从零编写所有REST/JSON-RPC方法,通过上述工具和框架,要么直接让gRPC服务兼容REST请求,要么生成和gRPC方法完全匹配的可重写服务器代码,大大提升开发效率。
内容的提问来源于stack exchange,提问作者KamilITS

