我该如何生成.proto文件或在C#中使用“Code First gRPC”?

22
我想在一个asp.net core web应用程序中使用.NET的gRPC。我该如何从现有的C#类和模型对象生成必要的.proto文件?我不想重新编写一个与现有代码镜像相同的.proto文件,我希望可以从类和模型对象自动生成.proto文件。

我调用这个方法来注册我的服务类。
builder.MapGrpcService<MyGrpcService>();

public class MyGrpcService
{
    public Task<string> ServiceMethod(ModelObject model, ServerCallContext context)
    {
        return Task.FromResult("It Worked");
    }
}

ModelObject[DataContract][DataMember]与顺序属性。

这可能吗?我在网上看到的每个例子都是以.proto文件开头的。我已经在MyGrpcService类中定义了所需的服务方法。但也许这只是与标准做事方式相反的...

类似于旧的.NET远程调用,您可以从远程端点请求接口,它会自动使用gRPC进行来回通信,这将是理想的,但也许这是过于简单化的看法。


我发现这个视频对于入门gRPC非常有帮助。 - RobIII
1
是的,使用gRPC的“标准做法”是先指定.proto规范,然后使用代码生成器创建必要的代码。 - phuzi
感谢提供视频链接,我已经花了几天时间熟悉.proto文件和gRPC的工作原理,只是有很多接口和模型对象,希望能够使用一些自动化工具来处理...但也许无法避免重写包装器并使用工具生成.proto文件,或者手动编写.proto文件。 - jjxtra
对于 C# 到 C# 的互操作,protobuf-net.Grpc 中的 AddCodeFirstGrpc 是最佳选择。客户端可以使用 protobuf-net.Grpc 仅通过接口、IP 和端口访问 Grpc 服务。如果您需要其他语言调用您的 C# grpc 服务的互操作性,您可以从 C# 代码生成 .proto,请参见 https://dev59.com/SnM_5IYBdhLWcg3wiDyA。 - jjxtra
我可以再问一件事吗?客户端代码是什么样子的?提前感谢。 - Stefano Vuerich
1个回答

19
你可以使用Marc Gravell的 protobuf-net.Grpc 来实现此操作。他开始开发这个库就是为了在构建gRPC服务时拥有代码优先的体验,它依赖于protobuf-net,该库已经为C#类型和protobuf之间的序列化添加了功能。
查看文档以了解如何开始使用此库,或者您甚至可以观看Marc在以下其中一次演讲中介绍此主题的录像:“使用gRPC和其他技巧在服务之间通信”。 我认为他实际上为.NET Core 3.0发布版更新了9月份的版本,因此那可能是更新的版本。
还有一些代码示例可供参考,了解如何设置它。

谢谢,我会关注的,希望大部分都可以自动化。 - jjxtra
1
视频的一小时两分钟处是他开始谈论Code First的地方。 - jjxtra
1
@jjxtra 在 GitHub 上有一个“入门指南”和所有演讲的示例。 - Marc Gravell
@MarcGravell 非常有帮助且文档详尽,感谢您指引我正确的方向 :) - jjxtra
4
问题已经存在,如何在 .net 中首先从代码创建 grpc,然后生成 protobuf,以便其他平台使用。 - Farshid Saberi
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接