protocol-buffers - 将 ProtoBuf-net 与 gRPC 一起使用

标签 protocol-buffers protobuf-net protogen

我正在尝试在工作中构建一个利用 gRPC 的 PoC。谷歌文档here带我们通过一个示例应用程序。我想知道 protobuf-net,特别是 protogen,是否有能力理解执行 gRPC 调用所需的服务定义和类?或者这是正在做的事情?如果我使用 google 的 protoc 来生成客户端和服务器代码(涉及服务定义和 RPC 调用)并为我的业务对象使用 protobuf-net,它会起作用吗?

最佳答案

protobuf-net.Grpc现在是一件事......虽然在预览中。当 .NET Core 3 出现时,我们应该能够使其可用。

它受到 WCF 方法的启发,因此您的服务接口(interface)通过以下方式定义:

namespace Whatever {
    [ServiceContract]
    public interface IMyAmazingService {
        ValueTask<SearchResponse> SearchAsync(SearchRequest request);
        // ... etc
    }
}

服务器只实现接口(interface):

public class MyServer : IMyAmazingService {
    // ...
}

(托管它们的方式取决于您使用的是 ASP.NET Core,还是 native /非托管 gRPC 库;两者都有效)

客户端只请求接口(interface):

var client = http.CreateGrpcService<IMyAmazingService>();
var result = await client.SearchAsync(query);

在上述情况下,这将被推断为 Whatever.MyAmazingService/Search gRPC 术语中的服务,即

package Whatever;
// ...
service MyAmazingService {
    rpc Search (SearchRequest) returns (SearchResponse) {}
}

但如果您愿意,可以更明确地配置服务/方法名称。以上是一元示例;对于一元运算,结果可以是 T 中的任何一个, Task<T> , ValueTask<T> - 或 void/Task/ValueTask (所有映射到 .google.protobuf.Empty ,没有合适输入参数的方法也是如此)。

如果您使用 IAsyncEnumerable<T>,则会自动推断流/双工操作(对于某些 T )用于输入参数(客户端流式传输)、返回类型(服务器流式传输)或两者(双工)。

关于protocol-buffers - 将 ProtoBuf-net 与 gRPC 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55126824/

相关文章:

c# - protobuf-net - 从 .proto 生成的类 - 重复字段是否应该是只读的,没有 setter ?

python - 在 Python 中将日期时间转换为 protobuf 时间戳

c++ - 谷歌 protobuf 和 A​​ndroid NDK

protocols - 必须为现有的 proto 包含 Map 创建 java pojo

c# - 具有通用类层次结构的 Protobuf 属性

c# - protobuf-net:序列化一个空列表

c# - 使用 protogen 为每个文件输出一个 C# 类?

c++ - 如何获得有关 protobuf 解析期间生成的错误的更多详细信息? (C++)

c# - 我可以选择检索 protobuf-net 或 NHibernate 中的对象字段吗?